带有静态const的make_pair上的未定义引用

时间:2014-09-29 09:24:56

标签: c++ gcc c++11

以下代码在我的class.cpp中的gcc 4.7中出错:

  auto TLV1 = std::make_pair(UNSIGNEDCHAR_STATIC_CONST, Value1); 
  auto TLV2 = std::make_pair(UNSIGNEDCHAR_STATIC_CONST, Value2); 

UNSIGNEDCHAR_STATIC_CONST在课堂上定义static const unsigned char,值vector<unsigned char>在函数中定义

编辑:在我的class.h中:

static const unsigned char UNSIGNEDCHAR_STATIC_CONST = 0x4F;

链接器错误:

 undefined reference to `foo::UNSIGNEDCHAR_STATIC_CONST'
 undefined reference to `foo::UNSIGNEDCHAR_STATIC_CONST'

以下代码不会重现错误:

  unsigned char t = UNSIGNEDCHAR_STATIC_CONST;
  auto TLV1 = std::make_pair(t, Value1); 
  auto TLV2 = std::make_pair(t, Value2); 

编辑: 由于Neil Krik的演员,我已经让它工作正常了:

auto TLV1 = std::make_pair(static_cast(UNSIGNEDCHAR_STATIC_CONST), Value1); 

或Vlad解决方案,在cpp文件中:

const unsigned char foo::UNSIGNEDCHAR_STATIC_CONST= 0x4F

1 个答案:

答案 0 :(得分:1)

编译器要求定义此静态成员。目前它只在课堂上宣布。

在某些cpp模块中包含以下行

const unsigned char foo::UNSIGNEDCHAR_STATIC_CONST;

根据C ++标准

  

3如果非易失性const静态数据成员是整数或   枚举类型,它在类定义中的声明可以指定   一个括号或等于初始化器,其中每个初始化器子句都是   assignmentexpression是一个常量表达式(5.19)。静态数据   文本类型的成员可以在类定义中声明   constexpr说明符;如果是的话,其声明应指明一个   brace-or-equal-initializer,其中每个初始化子句都是   赋值表达式是一个常量表达式。 [注意:两者都有   在这些情况下,成员可能出现在常量表达式中。 - 注意   如果成员仍然在命名空间范围内定义成员   程序中的odr-used(3.2)和命名空间范围定义   不得包含初始化程序