Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么此模板变量会导致编译器警告?_C++_Templates_Clang_Compiler Warnings_C++14 - Fatal编程技术网

C++ 为什么此模板变量会导致编译器警告?

C++ 为什么此模板变量会导致编译器警告?,c++,templates,clang,compiler-warnings,c++14,C++,Templates,Clang,Compiler Warnings,C++14,为什么我会收到叮当声的警告?对我来说,这似乎是对模板常量的合理使用 警告:变量'M_PI'具有内部链接,但未定义[-Wundefined internal] 包括 样板 constexpr T M_PI=T3.1415926535897932; 样板 恒速计算 { 返回d*M_PI; } int main { std::cout我认为您应该忽略警告,现在应该完全避免使用变量模板 考虑 template <typename T> T var = 0; int main() { retu

为什么我会收到叮当声的警告?对我来说,这似乎是对模板常量的合理使用

警告:变量'M_PI'具有内部链接,但未定义[-Wundefined internal]

包括 样板 constexpr T M_PI=T3.1415926535897932; 样板 恒速计算 { 返回d*M_PI; } int main {
std::cout我认为您应该忽略警告,现在应该完全避免使用变量模板

考虑

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>(); }

我想说,这表明clang中变量模板的实现是不完整的。您使用constexpr只会使clang检测到自己的不完整实现。

我认为您应该忽略警告,现在应该完全避免使用变量模板

考虑

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>(); }

我想说,这表明clang中变量模板的实现是不完整的。您使用constexpr只是让clang检测到它自己的不完整实现。

这是一个与clang早期版本一样的错误。另请参见和,它们是具有类似症状的不同错误。这些都在clang 3.5中修复。

> 这是一个与Clang早期版本相同的bug。另请参阅和,它们是具有类似症状的不同bug。这些bug在Clang 3.5中都已修复。

@hvd此代码从main返回一个常量值,因此它当然没有意义,但由于它看起来足够简单,但却生成了一个警告,因此变得毫无意义uld想知道为什么。@hvd这段代码从main返回一个常量值,所以它当然毫无意义,但由于它看起来很简单,但却生成了一个警告,所以变得毫无意义,我想知道为什么。