我正在尝试将 Windows / Visual C ++ 2010 中的 C ++ 代码移植到 Linux(Ubuntu 12.04)平台 1 。
代码试图使用boost
shared_ptr
访问静态成员变量。当我将此代码移植到Linux时,我得到:"undefined reference to Test::TYPE"
,即使它在Windows上编译并正常工作。
以下是演示错误的测试程序:
#include <iostream>
#include <boost/shared_ptr.hpp>
class Test
{
public:
Test(int x, int y) : a_(x), b_(y) { }
void print() { std::cout << "a_ : " << a_ << ", b_ : " << b_ << std::endl; }
static const unsigned int TYPE = 5;
private:
int a_;
int b_;
};
int main()
{
boost::shared_ptr<Test> pTest(new Test(10, 20));
pTest->print();
std::cout << "Test Type is: " << pTest->TYPE << std::endl;
return 0;
}
我想知道为什么GCC为上面的代码提供了未定义的引用?
注意:它工作正常如果我使用简单的指针而不是boost shared_ptr
。
1。我正在使用Ubuntu Linux 12.04,gcc版本4.6.4和增强1.44。
答案 0 :(得分:0)
&#34;未定义的参考&#34;是链接器错误。显然,编译器使用常量的地址,可能是因为它不够聪明,不能意识到它总是相同的常量。
当以需要常量地址的方式使用时,例如通过引用传递它,你还必须提供常量的定义(在某些.cpp文件中)。
通过共享指针访问常量似乎比必要的复杂一点。使用Test::TYPE
可以使编译器更容易。