【问题标题】:C++ static constexpr class member with complex class linking issues [duplicate]具有复杂类链接问题的 C++ 静态 constexpr 类成员 [重复]
【发布时间】: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


【解决方案1】:

答案是将这个添加到源文件中:

constexpr CU S::u;

感谢@chris 和@Drew Dormann。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-05
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多