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

Posted

技术标签:

【中文标题】使用 boost::shared_ptr 访问静态成员变量【英文标题】:Accessing static member variable using boost::shared_ptr 【发布时间】:2015-09-27 08:02:19 【问题描述】:

我正在尝试将工作 C++ 代码从 Windows/Visual C++ 2010 移植到 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 和 boost 1.44。

【问题讨论】:

无法在 ubuntu 14.04 上重现。 在 Ubuntu gcc 版本 4.9.2 (Ubuntu 4.9.2-0ubuntu1~12.04) 上完美运行,Boost 版本:1.46.1 【参考方案1】:

“未定义的引用”是链接器错误。显然,编译器使用了常量的地址,可能是因为它不够聪明,无法意识到它始终是同一个常量。

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

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

【讨论】:

以上是关于使用 boost::shared_ptr 访问静态成员变量的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 boost::shared_ptr 构造二叉树

Boost智能指针——shared_ptr

使用带有 boost::shared_ptr 的基类在地图中查找

返回 boost::shared_ptr 和从返回的原始指针构造 boost::shared_ptr 有啥区别?

boost::shared_ptr与定制删除器

boost库之内存管理shared_ptr