在Visual C ++下使用模板专业化时编译器错误

时间:2016-02-23 16:36:39

标签: 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 ++的解决方法?

2 个答案:

答案 0 :(得分:3)

通过在调用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>();

答案 1 :(得分:-1)

而不是专业化,我没有&#34;模板&#34;关键字,像这样:

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

void foo(float value)
{
}

我在gcc和Visual Studio 2012中使用它们。