gpt4 book ai didi

C++ 部分排序因 2 个模板参数而失败

转载 作者:太空狗 更新时间:2023-10-29 22:53:06 25 4
gpt4 key购买 nike

因此给定以下部分特化的模板函数

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> >]

我看不出第二个模板参数现在如何使重载变得模棱两可。据我所知, vector 版本应该更专业。这只是 3.4 中的错误吗?有解决方法吗?

郑重声明,代码在 gcc 4.1 中运行没有问题。不幸的是,我们的一些工具仍然绑定(bind)到 3.4,因此升级不是解决方案。

谢谢。

最佳答案

这似乎与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;
}

关于C++ 部分排序因 2 个模板参数而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3086691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com