因此,给出以下具有部分特化的模板函数
template<typename T>
void foo(vector<T> &in) {
cout << "vector" << endl;
}
template<typename T>
void foo(T &in) {
cout << "scalar" << endl;
}
int main(int arc, char *argv[]) {
vector<double> a;
double b;
foo(a);
foo(b);
return 0;
}
使用g ++ 3.4.6进行编译没有问题,并获得预期的输出:
vector
scalar
现在,如果我添加第二个模板参数:
template<class U, typename T>
void foo2(vector<T> &in) {
U a;
cout << "vector" << endl;
}
template<class U, typename T>
void foo2(T &in) {
U a;
cout << "scalar" << endl;
}
并使用以下内容进行调用:
int main(int arc, char *argv[]) {
vector<double> a;
double b;
foo2<double>(a);
foo2<double>(b);
return 0;
}
当我尝试编译它时,GCC 3.4.6给出了一个模糊的过载错误。
error: call of overloaded `foo2(std::vector<double, std::allocator<double> >&)' is ambiguous
note: candidates are: void foo2(std::vector<T, std::allocator<_T2> >&) [with U = double, T = double]
note: void foo2(T&) [with U = double, T = std::vector<double, std::allocator<double> >]
我无法看到第二个模板参数现在如何使重载变得模糊。据我所知,矢量版本应该更专业。这只是3.4中的一个错误吗?有解决方法吗?
对于记录,代码在gcc 4.1中工作没有问题。不幸的是,我们的一些工具仍然与3.4相关联,因此升级不是解决方案。
感谢。
答案 0 :(得分:2)
这似乎与最新版本编译器中this defect fixed有关。解决方法是显式设置模板的所有参数或改为使用仿函数:
template<typename U>
struct foo2 {
template<typename T>
void operator()( std::vector<T> &in ) {
U a;
cout << "vector" << endl;
}
template<typename T>
void operator()( T& in ) {
U a;
cout << "scalar" << endl;
}
};
int main(int arc, char *argv[]) {
vector<double> a;
double b;
foo2<double>()(a);
foo2<double>()(b);
return 0;
}