标题:关于namespace的一个小问题
只看楼主
thlgood
Rank: 5Rank: 5
等 级:职业侠客
帖 子:281
专家分:381
注 册:2010-9-24
结帖率:91.43%
已结贴  问题点数:20 回复次数:7 
关于namespace的一个小问题
我的程序简化后是这样的:

程序代码:

//--------------------以下是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++语法。
搜索更多相关主题的帖子: namespace include color 
2013-04-16 15:41
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
得分:7 
namespace BpNet{
    class bpn_conn;
}
这是前置声明

但是class bpn_conn
没在这个命名空间里面啊

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-04-16 15:51
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:7 
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;
}

2013-04-16 16:00
thlgood
Rank: 5Rank: 5
等 级:职业侠客
帖 子:281
专家分:381
注 册:2010-9-24
得分:0 
下面是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


o(∩∩)Linux & Python 群:187367181
2013-04-16 16:06
thlgood
Rank: 5Rank: 5
等 级:职业侠客
帖 子:281
专家分:381
注 册:2010-9-24
得分:0 
我把该楼的回复删除了

[ 本帖最后由 thlgood 于 2013-4-16 16:42 编辑 ]

o(∩∩)Linux & Python 群:187367181
2013-04-16 16:20
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
得分:0 
以下是引用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是一个东西吗?

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-04-17 06:46
aoguren
Rank: 2
等 级:论坛游民
帖 子:29
专家分:43
注 册:2009-5-4
得分:7 
我简单的测试了一下,可以参考我的程序。
如有写的不好的地方,还请大家多多指点。
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的具体形式,它包括哪些东西不清楚。
2013-04-17 13:23
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
得分:0 
以下是引用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的具体形式,它包括哪些东西不清楚。


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

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-04-17 13:26



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-404411-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.598257 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved