c++ - 在 Visual C++ 下使用模板特化时出现编译器错误

标签 c++ templates visual-c++

我有以下cpp代码:

#include <iostream>
#include <limits>

// C2589 when compiling with specialization, fine when compiling without
template<typename T>
void foo(T value = std::numeric_limits<T>::infinity() )
{
}

// this specialization causes compiler error C2589 above
template<>
void foo<float>( float value )
{
}

int main()
{
    foo<float>();
    return 0;
}

当我尝试使用 Visual Studio 2013 编译它时,出现以下错误:

..\check2\main.cpp(5) : error C2589: '::' : illegal token on right side of '::'
..\check2\main.cpp(5) : error C2059: syntax error : '::'

如果我不包含特化 foo<float>,程序编译正常.该代码还可以在 gcc 4.8.4 下编译得很好包括特化,这表明 Visual C++ 编译器存在一些问题。

代码是否正确,是否应该编译?是否有适用于 Visual C++ 的解决方法?

最佳答案

调用foo<float>();时省略参数您正在将编译器置于一个难题中。编译器同时得出结论,专门的函数是正确的选择,因为你明确地说 <float> , 而不是那个,因为没有参数。编译器然后找到通用版本,但它不能,因为有一个专门的版本。即使是 HAL9000 也无法弄清楚那个,除非它是用 gcc 构建的。 VC++ 错误地处理了这种情况。可能是一个错误,而不是“设计使然”。

Visual C++ 的解决方法是使用重载:

template<typename T>
void foo(T value)
{
}

template<typename T>
void foo()
{
    foo(std::numeric_limits<T>::infinity());
}

像往常一样调用它foo<float>();

关于c++ - 在 Visual C++ 下使用模板特化时出现编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35583062/

相关文章:

c++ - 模板函数与具有自动参数的命名 lambda

java - 避免 Java 类型删除

javascript - 如何从代码中以管理员身份运行 Chrome

c++ - 调试版本的静态库会泄露源代码信息吗?

c++ - linux上的系统时间变化检测

c++ - M_PI 标记为未声明的标识符

c++ - 为什么全局数组大小应该是整数常量?

c++ - 循环中的函数,参数不变

c++ - 指定容器类型的迭代器类型的部分特化

c++ - 是否可以从 CMFCRibbonCategory 中删除 CMFCRibbonPanel?