我遇到一个奇怪的问题,用-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中。
有什么想法吗?
答案 0 :(得分:1)
您可以通过添加
来解决这个问题template<typename T> constexpr const T stupid<T>::t;
定义stupid
。
这是因为调用非静态成员函数
t
要求t
的地址用作this
指针。获取对象的地址使其需要运行时实例,这需要上述定义。