以下代码在我的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
答案 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)和命名空间范围定义 不得包含初始化程序。