C++ &引用;模棱两可的模板专门化”;问题

C++ &引用;模棱两可的模板专门化”;问题,c++,templates,gcc,porting,C++,Templates,Gcc,Porting,我目前正在移植一堆以前只使用VisualStudio2008编译的代码。 在这段代码中,有这样一种安排: template <typename T> T convert( const char * s ) { // slow catch-all std::istringstream is( s ); T ret; is >> ret; return ret; } template <typename T, typenam

我目前正在移植一堆以前只使用VisualStudio2008编译的代码。 在这段代码中,有这样一种安排:

template <typename T> 
T convert( const char * s )
{
    // slow catch-all
    std::istringstream is( s );
    T ret;
    is >> ret;
    return ret; 
}

template <typename T, typename T2>
T convert( T2 * s )
{
    return convert<T>( static_cast<const char*>( s ));
}

template <typename T, typename T2>
T convert( T2 s )
{
    return T( s );
}

template <>
inline int convert<int>( const char * s )
{
    return (int)atoi( s );
}
int i = convert<int>( szInt );
模板
T转换(常量字符*s)
{
//慢通吃
std::istringstream为(s);
T-ret;
是>>ret;
返回ret;
}
模板
T转换(T2*s)
{
返回转换(静态_转换);
}
模板
T转换(t2s)
{
返回T(s);
}
模板
内联整数转换(常量字符*s)
{
返回(int)atoi(s);
}
通常,模板化函数有很多专门化,返回类型不同,调用方式如下:

template <typename T> 
T convert( const char * s )
{
    // slow catch-all
    std::istringstream is( s );
    T ret;
    is >> ret;
    return ret; 
}

template <typename T, typename T2>
T convert( T2 * s )
{
    return convert<T>( static_cast<const char*>( s ));
}

template <typename T, typename T2>
T convert( T2 s )
{
    return T( s );
}

template <>
inline int convert<int>( const char * s )
{
    return (int)atoi( s );
}
int i = convert<int>( szInt );
int i=convert(szInt);
问题是,这些模板专门化会导致“模棱两可的模板专门化”。 如果不是返回类型区分了这些函数专门化,我显然可以使用重载,但这不是一个选项

我如何解决这个问题而不必更改转换函数调用的所有位置

更新 我添加了这两个我第一次忽略的全面模板专门化。 我很难为情地说,我不确定第二个的动机,但第一个原因是转换函数在许多地方被使用,其中字符串数据作为一个空*传递。 我现在无法与GCC进行检查,但我怀疑这可能是问题所在

更新2 下面是完整的cpp文件,它将重现这一点。 如果删除这两个“通用”函数,它将编译。 如果您让它们中的任何一个保留下来,将导致模棱两可的模板专门化错误

#include <iostream>
#include <sstream>

template <typename T> 
T convert( const char * s )
{
    // this is a slow slow general purpose catch all, if no specialization is provided
    std::istringstream is( s );
    T ret;
    is >> ret;
    return ret; 
}

// general purpose 1
template <typename T, typename T2>
T convert( T2 * s )
{
    return convert<T>( static_cast<const char*>( s ));
}

// general purpose 2
template <typename T, typename T2>
T convert( T2 s )
{
    return T( s );
}

// Type specialized

template <>
inline float convert<float>( const char * s )
{
    return (float)atof( s );
}

int main( int argc, const char * sz[] )
{
    return 0;
}
#包括
#包括
模板
T转换(常量字符*s)
{
//如果没有提供专门化,这是一个缓慢的通用通用通用型的包罗万象
std::istringstream为(s);
T-ret;
是>>ret;
返回ret;
}
//一般用途1
模板
T转换(T2*s)
{
返回转换(静态_转换);
}
//一般用途2
模板
T转换(t2s)
{
返回T(s);
}
//类型专用
模板
内联浮点转换(常量字符*s)
{
返回(浮动)atof(s);
}
int main(int argc,const char*sz[]
{
返回0;
}

显然
返回转换(静态转换)(或者其他我看不到的东西)正在引导编译器为t=float创建一个
t convert(const char*s)
的模板实例化。然后,当您稍后尝试专门化它时,它失败了,因为模板版本已经存在


当我将
inline float convert(const char*s)
移动到通用转换器之前(紧跟在
const char*
模板函数之后),我能够使用g++4.2成功编译。

代码中一定还有其他东西没有在问题中显示。上面的代码没有任何歧义,我已经测试过它是否可以用g++(i686-apple-darwin10-g++-4.2.1)正确编译。试着提出一个例子,你看到了模棱两可的地方并编辑了这个问题。如果我理解正确,这可能已经为你做了:是的——回应大卫·罗德里格斯的评论,你能提供一个简单的例子来重现这个问题吗?我会在我靠近运行这个项目的mac电脑的时候做这件事——很抱歉,我一开始没有这么做。Bad form.aaa,我不能使用boost,但谢谢你的建议。它的一个变体对我也起了作用——你可以看到“你看不见的东西”——这是使用模板的一段代码,它在某一点上使用t=float。非常感谢。