我有以下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 ++的解决方法?
答案 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中使用它们。