注册 登录
编程论坛 C++教室

关于namespace的一个小问题

thlgood 发布于 2013-04-16 15:41, 838 次点击
我的程序简化后是这样的:

程序代码:


//--------------------以下是bpn_conn.hpp中的内容----------------
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string>
#include <cstring>
#include <arpa/inet.h>

namespace BpNet{
    class bpn_conn;
}

class bpn_conn
{
private:
    int    _port;
    string _addr;
public:
    bpn_conn(string addr, int port)
    {
        _addr = addr;
        _port = port;
    }
};

-------------------以下是main.cpp中的内容-----------------
#include <iostream>
#include "bpn_conn.hpp"

using namespace BpNet;
int main()
{
    bpn_conn con("127.0.0.1", 80);
    return 0;
}


以上是一段被我简化过的代码,其中一个是hpp头文件(不是.h头文件),另一个是主函数所在的文件main.cpp

代码中的问题就是把下面的代码注释掉就能通过编译,如果不注释掉会报错
程序代码:

/*
namespace BpNet{
class bpn_conn;
}
*/

...
//using namespace BpNet
...


错误为:
程序代码:

../BpNet/main.cpp: In function 'int main()':
../BpNet/main.cpp:8:5: error: reference to 'bpn_conn' is ambiguous
../BpNet/bpn_conn.hpp:16:7: error: candidates are: class bpn_conn
../BpNet/bpn_conn.hpp:11:11: error:                 struct BpNet::bpn_conn
../BpNet/main.cpp:8:14: error: expected ';' before 'con'

这是什么原因呢?
namespace的使用方法错在哪里呢?

我是C++新手,不太熟悉C++语法。
7 回复
#2
peach54602013-04-16 15:51
namespace BpNet{
    class bpn_conn;
}
这是前置声明

但是class bpn_conn
没在这个命名空间里面啊
#3
rjsp2013-04-16 16:00
peach5460所言一针见血

程序代码:
#include <string>

namespace BpNet {

class bpn_conn
{
private:
    int    _port;
    std::string _addr;
public:
    bpn_conn(const std::string addr, int port)
    {
        _addr = addr;
        _port = port;
    }
};

}

///////////////////////////////////////////////////

using namespace BpNet;

int main()
{
    bpn_conn con("127.0.0.1", 80);

    return 0;
}

#4
thlgood2013-04-16 16:06
下面是Qt生成的一段代码,是头文件mainwindow.h的内容,为什么它这样又可以呢。

程序代码:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
   
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
   
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

#5
thlgood2013-04-16 16:20
我把该楼的回复删除了

[ 本帖最后由 thlgood 于 2013-4-16 16:42 编辑 ]
#6
peach54602013-04-17 06:46
以下是引用thlgood在2013-4-16 16:06:58的发言:

下面是Qt生成的一段代码,是头文件mainwindow.h的内容,为什么它这样又可以呢。
 
 
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include  
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
     
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
     
private:
    Ui::MainWindow *ui;
};
 
#endif // MAINWINDOW_H
 

你看清楚,这两个mainwindows是一个东西吗?
#7
aoguren2013-04-17 13:23
我简单的测试了一下,可以参考我的程序。
如有写的不好的地方,还请大家多多指点。
test_h.h 测试头文件
#ifndef TEST_H_H
#define TEST_H_H

#include <iostream>

using namespace std;

namespace BpNet
{
    class bpn_conn
    {
    public:
        bpn_conn(const string &addr, int port);
        
    private:
        int m_port;
        string m_addr;
    };
}
#endif

test_s.cpp 测试源文件
#include "test_h.h"
//using namespace BpNet;
BpNet::bpn_conn::bpn_conn(const string &add, int port)
{
    m_port = port;
    m_addr = add;

    cout << "port: " << m_port << endl;
}

test.cpp 主函数的主要测试。
#include<iostream>
//#include<string>
#include "test_h.h"

//using namespace std;
using namespace BpNet;

int main(void)
{
    BpNet:: bpn_conn bpn_conn("127.0.0.1", 80);
    return 0;
}

经测试,已经可以直接使用。

你的主要问题是namespace BpNet{
    class bpn_conn;
}
它没有告诉namespace BpNet 关于class bpn_conn的具体形式,它包括哪些东西不清楚。
#8
peach54602013-04-17 13:26
以下是引用aoguren在2013-4-17 13:23:12的发言:

我简单的测试了一下,可以参考我的程序。
如有写的不好的地方,还请大家多多指点。
test_h.h 测试头文件
#ifndef TEST_H_H
#define TEST_H_H

#include <iostream>

using namespace std;

namespace BpNet
{
    class bpn_conn
    {
    public:
        bpn_conn(const string &addr, int port);
        
    private:
        int m_port;
        string m_addr;
    };
}
#endif

test_s.cpp 测试源文件
#include "test_h.h"
//using namespace BpNet;
BpNet::bpn_conn::bpn_conn(const string &add, int port)
{
    m_port = port;
    m_addr = add;

    cout << "port: " << m_port << endl;
}

test.cpp 主函数的主要测试。
#include<iostream>
//#include<string>
#include "test_h.h"

//using namespace std;
using namespace BpNet;

int main(void)
{
    BpNet:: bpn_conn bpn_conn("127.0.0.1", 80);
    return 0;
}

经测试,已经可以直接使用。

你的主要问题是namespace BpNet{
    class bpn_conn;
}
它没有告诉namespace BpNet 关于class bpn_conn的具体形式,它包括哪些东西不清楚。


没看懂你测的和楼主的问题有什么联系?
1