使用boost :: shared_ptr访问静态成员变量

时间:2015-09-27 08:02:20

标签: c++ gcc boost

我正在尝试将 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。

1 个答案:

答案 0 :(得分:0)

&#34;未定义的参考&#34;是链接器错误。显然,编译器使用常量的地址,可能是因为它不够聪明,不能意识到它总是相同的常量。

当以需要常量地址的方式使用时,例如通过引用传递它,你还必须提供常量的定义(在某些.cpp文件中)。

通过共享指针访问常量似乎比必要的复杂一点。使用Test::TYPE可以使编译器更容易。