boost :: lexical_cast为静态成员变量生成未定义的引用

时间:2015-08-25 14:20:43

标签: c++ boost

对于我不理解的静态成员变量,我遇到与boost::lexical_cast的链接错误。

这是一个展示问题的小样本(我知道这很愚蠢,我可以<< candy;但这表明我在lexical_cast中使用的问题很少见):

#include <iostream>
#include <boost/lexical_cast.hpp>

using namespace std;

class Test
{
public:
    void print_candy() const
    {
        cout << "candy is: " << boost::lexical_cast<string>(candy) << endl;
    }
private:
    static const unsigned int candy = 0;
};

int
main(int argc, char *argv[])
{
    Test t;
    t.print_candy();
    return 0;
}

编译时会产生以下错误:

$ /opt/gcc-google-4.8/bin/g++ -Wall -I/usr/include --std=c++11 test.cc -o test
/tmp/cc9MV6cQ.o:test.cc:function Test::print_candy() const: error: undefined reference to 'Test::candy'
collect2: error: ld returned 1 exit status

很明显,糖果是定义的。如果我删除词汇演员并将糖果重定向到外面,程序会编译并链接正常。

一些观察结果:

  • 将成员变量设为公开删除问题。也就是说,我仍然使用公共变量获得链接器错误。
  • 使会员成为非静态会让问题消失。
  • 如果我创建一个局部变量,它是静态变量的副本并将其传递给lexical_cast,它可以正常工作。

所以我想明白:

  • 为什么静态成员变量未定义为lexical_cast?
  • 解决这个问题最优雅的方法是什么?我不想删除静态,也不想创建一个必要的局部变量。

0 个答案:

没有答案