2013-12-23 162 views
-2

我有以下代码:C++类的静态成员初始化

class employee { 
public: 
    static int last_id; 
    ... 

}; 

int main() { 
    employee::last_id=0; 
} 

当我尝试运行它,它提供了以下错误:

Undefined symbols for architecture x86_64: 
    "employee::last_id", referenced from: 
     _main in chap7-F3IpS1.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
[Finished in 0.3s with exit code 1] 
+0

应该用google搜索这个。我记得遇到这个错误。当我GOOGLE了它,前10个左右的结果指向堆栈溢出。难怪我可以解决这个问题,而不会发布*另一个副本。* – 2013-12-23 19:44:18

回答

3
int employee::last_id=0; 
int main() { 
    [...] 

} 
3

你只是声明了静态数据成员但没有定义它。在全局命名空间的主要之前写入

int employee ::last_id; 

尽管您明确指定了初始化程序,但它将被初始化为0。

+0

如果这个数据成员应该是一个常量,那么它可以在类定义中初始化。在这种情况下,它必须具有限定符const。 –

+0

@ VladfromMoscov:几乎正确。然而,类定义中的一些静态'x'的初始化并不会将'x'的声明转换为定义...对于普通的'const'静态,如果地址被明确或隐含地采用(将'x'视为存储位置)。但是,使用C++ 11时,静态'x'可以声明为'constexpr',并在类定义中初始化,然后足够用于任何用法。 –

+0

值得注意的是,对于类模板中的统计信息,One Definition Rule有一个特殊的豁免(或者说,这种豁免是ODR的一部分)。这反过来又允许在头文件中定义任何类型的静态常量,而不使用包装函数和引用。我曾经称这是一个“成语”,但在回答了一些很自然的问题后,它变得痛苦地清楚,它绝对不是一个成语,尽管它只是普通的C++规则(在一个环形交叉路口时尚)。 ;-) –