未解决的外部符号欢闹

时间:2013-04-04 17:36:49

标签: c++ linker-errors

我在StackOverflow上通过类实现发现了一种类似Java的枚举的新方法。

在'自己的标题

中声明的符号类
class Symbols {

public:

    Symbols() {}

    static const Symbols CREATE;
              . . .
private:

    std::string the_symbol;

    // Symbols constructor
    Symbols (std::string symbol){
        this->the_symbol = symbol;
    }

public:

    std::string get_symbol(void) {
        return the_symbol;
    }

    void set_symbol(std::string new_value) { the_symbol = new_value; }  

    void initialize(void){
        const Symbols CREATE = Symbols("create");
                     . . .
    }
};

以多种方式在课堂中使用

bool RecursiveDescentParser::type_name(){
if (accept(Symbols::STRING) || accept(Symbols::INTEGER)){
    return true;
}
else
    return false;

}

symbol_ = Symbols::WHERE;

if (!boost::iequals(tokenizer_->peekAtNext(), symbol_.get_symbol(), loc_)){
    // complete any tokens
    std::string temp = tokenizer_->completeToken();                     
}

Symbols标题包含在几个类中。有许多类型

的编译器错误
1>recursive_descent_parser.obj : error LNK2001: unresolved external symbol "public: static class Symbols const Symbols::VALUES" (?VALUES@Symbols@@2V1@B)

是什么给出的?我收到了所有39个未解决的外部因素,其中一些与此问题无关。我正确定义头文件以确保没有重复的声明 并且所有课程都能正确编译。

2 个答案:

答案 0 :(得分:3)

你已经宣布了静态成员;但它也需要在一个源文件中定义和初始化。

const Symbols Symbols::CREATE("create");

我猜你认为这是initialize函数正在做的事情;但它只是创建一个Symbols类型的本地对象,然后在函数返回时销毁它。

答案 1 :(得分:1)

使用static const Symbols CREATE;,您只声明符号类型的静态const对象在某处,这使编译器感到满意。

但是需要有一些实际定义CREATE对象的地方,这就是链接器无法找到它的原因。

你必须把

const Symbols Symbols::CREATE;

一个的cpp文件中。这样,实际上将分配一个存储位置,以便链接器可以找到它。