3

我遇到了一个奇怪的问题,其中编译的代码-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 中。

有任何想法吗?

4

1 回答 1

1

您可以通过添加来解决此问题

template<typename T> constexpr const T stupid<T>::t;

的定义之后stupid

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

于 2013-03-17T00:37:28.940 回答