static constexpr的常量链接失败

C++语言 码拜 9年前 (2016-05-07) 1226次浏览
template <class STR ,LENGTH SIZE = VAR_FILL>
class TextRStream {
public:
	static constexpr LENGTH DELIMITERS_SIZE = 32 ;
	static constexpr LENGTH ESCAPES_SIZE = 32 ;
private:
	static constexpr STR STR_SLASH = STR ("\") ;
	static constexpr STR STR_EOS = STR ("\0") ;

部分代码
g++一编译就这样
temp.cpp:(.text$_ZN3CSC11TextRStreamIwLin1EEC1ERKNS_6BufferIwLin1EEEii[__ZN3CSC11TextRStreamIwLin1EEC1ERKNS_6BufferIwLin1EEEii]+0xd6): undefined reference to `CSC::TextRStream<wchar_t, -1>::STR_SLASH”
temp.cpp:(.text$_ZN3CSC11TextRStreamIwLin1EEC1ERKNS_6BufferIwLin1EEEii[__ZN3CSC11TextRStreamIwLin1EEC1ERKNS_6BufferIwLin1EEEii]+0xdd): undefined reference to `CSC::TextRStream<wchar_t, -1>::STR_SLASH”
讲道理constexpr的变量不需要类外初始化的吧,编译器应该保证将它们全部内联才对

解决方案

50

取地址或初始化引用:

Quote: 引用:
Quote: 引用:
Quote: 引用:

试了一下,g++ 没问题,估计是题主编译器太旧了吧。

是测试样例没有覆盖到特定的使用方式,还是对这个成员变量的使用被优化掉了?

这是实现细节了,标准只要求 constexpr 是 literal type。
从错误信息看,题主实例化的类型是  TextRStream<wchar_t, -1>,妥妥的 literal type,要是 TextRStream<std::string, > 就不行了。

错误是本人将STR_SLASH放入容器里,而那容器的add函数只接受const T &和T &&类型的值,而且本人封装也不会考虑每一种模板参数啊

你把代码上全了吧,才不出来你怎么用的就错了,应该是能用表达式的地方都能用 constexpr。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明static constexpr的常量链接失败
喜欢 (0)
[1034331897@qq.com]
分享 (0)