2014-06-28 113 views
2

为什么我从Clang得到这个警告?这对我来说似乎是一种明智的使用模板常数。为什么此模板变量会导致编译器警告?

warning: variable 'M_PI<int>' has internal linkage but is not defined [-Wundefined-internal]

#include <iostream> 

template <typename T> 
constexpr T M_PI = T(3.1415926535897932); 

template <typename T> 
constexpr T CalcCircumference(T d) 
{ 
    return d * M_PI<T>; 
} 

int main() 
{ 
    std::cout << CalcCircumference(42.0f); 
} 

编辑:显然,一个简约的测试用例是混乱一些。我已经修饰了一下,希望能够缓解这一点。

+3

@hvd此代码从main返回一个常量值,所以*当然*它毫无意义,但由于它看起来很简单并且它会生成一个警告并且我想知道为什么会变得毫无意义。 –

回答

3

我认为你应该忽略这个警告,现在应该避免使用可变模板。

考虑

template <typename T> T var = 0; 
int main() { return var<int>; } 

这编译没有警告,链接,并运行返回零。

template <typename T> T var = 0; 
template <typename T> T func() { return var<T>; } 
int main() { return func<int>(); } 

该编译没有警告,但没有链接:它给出了一个错误消息。

 
$ clang++ test2.cc -o test2 -std=c++1y -pedantic -Wall 
/tmp/test2-736968.o:test2.cc:function int func(): error: undefined reference to 'var' 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

强制的显式实例做工作:

template <typename T> T var = 0; 
template int var<int>; 
template <typename T> T func() { return var<T>; } 
int main() { return func<int>(); } 

我会说这表明,可变模板铛实现是不完整的。您使用constexpr仅仅是为了让叮当检测到它自己的不完整实现。

1

这是在Clang早期版本中的一个错误(以PR19305提交)。另请参阅PR19571PR17846,这是具有类似症状的不同错误。这些都是在Clang 3.5中修复的。

相关问题