模板替换在调试版本中失败,但在优化版本中工作?

时间:2013-03-17 00:26:59

标签: c++ c++11 linker compiler-optimization template-specialization

我遇到一个奇怪的问题,用-Ox编译的代码编译得很好,但用-g编译的代码在链接上失败,出现以下错误:

Undefined symbols for architecture x86_64:
  "stupid<dummy>::t", referenced from:
      stupid<dummy>::operator()(int, int) const in main.o

重现此问题的代码:

struct dummy { void operator()(const int a, const int b) const {} ; };

template <typename  T>
struct stupid {
 constexpr static T t = T(); // create a new one;

 stupid() {};
 void operator()(int a, int b) const { t(a, b); }
};


int main()
{
 const stupid<dummy> a;
 a( 1, 2 );
}

当代码被优化时,函数被内联并且不需要外部函数调用,但是当代码未被优化时,函数被调用但不存在? (我不确定为什么不存在......)。这发生在g ++ 4.7和4.8以及clang 3.2中。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以通过添加

来解决这个问题
template<typename T> constexpr const T stupid<T>::t;

定义stupid

之后

这是因为调用非静态成员函数 t要求t的地址用作this指针。获取对象的地址使其需要运行时实例,这需要上述定义。