【发布时间】:2015-10-31 13:52:48
【问题描述】:
我有以下:
头文件:
class CU
{
const char *u;
public:
constexpr CU (const char *u) :u(u) {}
constexpr const char *c_str () const { return u; } ;
constexpr operator const char * () const { return u; } ;
};
void test2 (const CU & r) ;
class S
{
public:
static constexpr CU u = CU("foo"); // linker error
/*
when I use the u in the normal constructor in a separate file I get a linker error
*/
S();
};
源文件:
#include "test.hpp"
#include <iostream>
void test2 (const CU & r)
{
std::cerr << r;
}
S::S()
{
test2(S::u);
}
int main () {
S a;
}
编译器的输出:
g++ -std=gnu++11 test.cpp test.hpp
/tmp/cceBFmJM.o: In function S::S():
test.cpp:(.text+0x35): undefined reference to S::u
collect2: error: ld returned 1 exit status
Makefile:2: recipe for target 'test' failed
make: *** [test] Error 1
在此处查看 bugzilla 报告: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67155
【问题讨论】:
-
我没有看到
S::u的定义。将其设为constexpr并不意味着声明就是定义。 -
对象在标题中内联定义。如果在标头中使用它可以工作,如果它是一个 c 字符串它可以工作,请参阅此处的代码github.com/h4ck3rm1k3/gcc-plugin-cpp-template/tree/constexpr/…
-
将此添加到 c 文件中解决了问题。 constexpr CU S::u;
-
这里是问题的最佳描述 gcc.gnu.org/wiki/… 感谢 Jonathan Wakely (@redi)
标签: c++ c++11 gcc static constexpr