C++ 多参数模板函数、重载和歧义错误

C++ 多参数模板函数、重载和歧义错误,c++,templates,C++,Templates,假设我正在编写某种转换运算符,我想这样使用它: SomeType a; AnotherType b = conv<AnotherType>(a); template <typename T> inline Point<T> conv(const Ipoint& p) { return Point<T>(p.x, p.y); } a型; 另一类型b=conv(a); 首先,我编写基本(默认)函数: template <ty

假设我正在编写某种转换运算符,我想这样使用它:

SomeType a;
AnotherType b = conv<AnotherType>(a);
template <typename T>
inline Point<T> conv(const Ipoint& p)
{
    return Point<T>(p.x, p.y);
}
a型;
另一类型b=conv(a);
首先,我编写基本(默认)函数:

template <typename T, typename U>
inline T conv(const U& a)
{
    return T(a);
}
模板
内联变压器(电容器U&a)
{
返回T(a);
}
但是,当我想这样做时,完全专门化(或非模板重载)不是问题:

SomeType a;
AnotherType b = conv<AnotherType>(a);
template <typename T>
inline Point<T> conv(const Ipoint& p)
{
    return Point<T>(p.x, p.y);
}
模板
内联点转换(常数Ipoint&p)
{
返回点(p.x,p.y);
}
由于模棱两可,我无法再从Ipoint(例如,到FunkyPoint)编写任何转换函数,最终导致了一个笨拙的用法:

Ipoint a;
Point<double> b = conv<double>(a); //ugly!
//Point<double> b = conv<Point<double> >(a); //I want that, but it (obviously) does not compile.
i点a;
b点=conv(a)//丑!
//b点=conv(a)//我想要它,但它(显然)无法编译。

有什么方法可以很好地完成它吗?

在类模板中实现主体,然后您可以部分地专门化:


模板
结构转换
{
静态T应用(U常数&U){返回T(U);}
};

模板 T conv(U const&U){return convert::apply(U);}

模板 结构转换 { 静态点应用(I点常量和u) { 返回点(u.x,u.y); } };


应该可以工作,但未经测试。

在类模板中实现主体,然后可以部分专门化:


模板
结构转换
{
静态T应用(U常数&U){返回T(U);}
};

模板 T conv(U const&U){return convert::apply(U);}

模板 结构转换 { 静态点应用(I点常量和u) { 返回点(u.x,u.y); } };


应该可以工作,但未经测试。

为什么不重写构造函数或强制转换运算符?因为我无权访问上述结构(Ipoint/Point)。为什么不重写构造函数或强制转换运算符?因为我无权访问上述结构(Ipoint/Point)。