内部类的实例化:“未声明的标识符”

时间:2014-09-28 03:01:22

标签: c++ class inner-classes

这可能是一个简单的错误,但我无法理解为什么以下编译正常,我期望:

class Foo {
public:
    class Bar {
    public:
        Bar(unsigned int a, unsigned int b) { }
    };
};

int main(int argc, char** argv) {
    Foo::Bar blah(1, 2);
    return 0;
}

虽然这不能编译:

A.cpp

#include "B.h"

int main(int argc, char** argv) {
    Foo::Bar blah(1, 2);
    return 0;
}

B.h

#ifndef A_INCLUDED
#define A_INCLUDED

class Foo {
public:
    class Bar {
    public:
        Bar(unsigned int a, unsigned int b);
    };
};

#endif

C.cpp

#include "B.h"

Foo::Bar::Bar(unsigned int a, unsigned b) {

}

使用GCC 4.8.1(将Sublime Text 3作为IDE)生成以下构建错误

  

C:\用户\ ALEXAN〜1 \应用程序数据\本地\ TEMP \ ccMujUOG.o:A.cpp :(文本+ 0x2B访问):   未定义的引用`Foo :: Bar :: Bar(unsigned int,unsigned int)'   collect2.exe:错误:ld返回1退出状态[完成0.3s]

当然,第二个片段应该与第一个片段相同,但在更多文件中解构,因为我想要使用的“真实代码”显然比这个例子大。

3 个答案:

答案 0 :(得分:0)

正如@thang所说,这是一个链接器问题。 Sublime Text更像是一个带有IDE功能的文本处理器而不是真正的IDE。它可以很好地构建单个文件,但不能构建如下所述的多文件项目:

Sublime Text not compiling multi-file projects in C++

解决这个问题的方法是使用命令行,然后使用以下命令:

g++ C.cpp A.cpp -o test

答案 1 :(得分:0)

尝试分离类并使用以下方法实例化类: 新

有时编译器会抱怨内部类,

答案 2 :(得分:0)

以下是详细说明的步骤:

  1. 编译您的实现

    g ++ -c C.cpp A.cpp

  2. 创建exe的链接

    g ++ -o myexe C.o A.o