我在一个类中添加一个成员变量
class CMySocket : public CAsyncSocket  
{public:
CMySocket();
virtual ~CMySocket();
private:
CTalkDlg* m_pDlg;         //*******这里出错
};什么都还不做,就是放在这里
结果编译报错:--------------------Configuration: Talk - Win32 Debug--------------------
Compiling...
Talk.cpp
d:\works\msworks\talk\mysocket.h(23) : error C2143: syntax error : missing ';' before '*'
d:\works\msworks\talk\mysocket.h(23) : error C2501: 'CTalkDlg' : missing storage-class or type specifiers
d:\works\msworks\talk\mysocket.h(23) : error C2501: 'm_pDlg' : missing storage-class or type specifiers
Generating Code...
Compiling...
TalkDlg.cpp
d:\works\msworks\talk\mysocket.h(23) : error C2143: syntax error : missing ';' before '*'
d:\works\msworks\talk\mysocket.h(23) : error C2501: 'CTalkDlg' : missing storage-class or type specifiers
d:\works\msworks\talk\mysocket.h(23) : error C2501: 'm_pDlg' : missing storage-class or type specifiers
Generating Code...
Compiling...
MySocket.cpp
d:\works\msworks\talk\mysocket.h(23) : error C2143: syntax error : missing ';' before '*'
d:\works\msworks\talk\mysocket.h(23) : error C2501: 'CTalkDlg' : missing storage-class or type specifiers
d:\works\msworks\talk\mysocket.h(23) : error C2501: 'm_pDlg' : missing storage-class or type specifiers
Generating Code...
Error executing cl.exe.Talk.exe - 9 error(s), 0 warning(s)这是什么原因?!
我已经把#include "TalkDlg.h"加入到CMySocket.h里面了
//去掉private:
CTalkDlg* m_pDlg;         //这个
就什么问题都没有

解决方案 »

  1.   

    可能你的 TalkDlg.h  又包含了mysocket.h 
    这样的相互引用 是不行的, 用向前声明:class CTalkDlg;class CMySocket : ....
    {
      ....
      CTalkDlg*  m_pDlg;
    };
    在MySocket.cpp 里包含 TalkDlg.h.
      

  2.   

    up楼上,建议使用前向声明,只要你在你的那个.h文件中不使用CTalkDlg类中的成员(定义指针,reference都可以,类对象不行),这样就可以顺利通过。但是如果你要使用CTalkDlg中的成员,这个方法就没有用了……
      

  3.   

    恩 的确是因为我在TalkDlg.h里
    #include "MySocket.h"
    把这个去掉就好了可问题是我在CTalkDlg里面还要声明两个CMySocket的变量
    private:
    CMySocket m_sListenSocket;
    CMySocket m_sConnectSocket;
    如果把include "MySocket.h"去掉的话就不行了...你说“用向前声明:”是什么意思,能不能具体一点 
    “在MySocket.cpp 里包含 TalkDlg.h.” 又是怎么一回事?
      

  4.   

    问题就奇怪在//去掉private:就什么问题都没有
      

  5.   

    TackDlg.h 不用改,还是用原来的. MySocket 照我说的改一下就行了. 向前引用 是为了解决你的这个 循环引用 的问题, 比如 A 引用了 B ,而B又引用 了A ,那么先声明哪个都不行,只能向前引用了.
      

  6.   

    问题就奇怪在//去掉private:就什么问题都没有
    --------------------------------------------
    楼主的意思应该是连下面这一句声明也去掉了,不然不会没有问题的
      

  7.   


    class CMySocket : ....
    {
      ....
      CTalkDlg*  m_pDlg;
    };
    之前加入一句
    class CTalkDlg;
    就可以了
    这就是向前声明?!能说明一下原因吗?