我有以下代码,它有两个版本的函数 foo。我希望是否为采用 AVar 类型的 foo 传递了一个变量,否则如果为要调用的 AConst 版本传递了一个 const。
#include <iostream>
template <typename T>
struct AConst
{
AConst(T x):t(x){}
const T t;
};
template <typename T>
struct AVar
{
AVar(const T& x):t(x){}
const T& t;
};
template <typename T>
void foo(AConst<T> a) { std::cout << "foo AConst\n"; }
template <typename T>
void foo(AVar<T> a) { std::cout << "foo AVar\n"; }
int main()
{
int i = 2;
foo(1);
foo(i);
return 0;
}
目前编译器给我一个歧义错误。不确定如何解决。
更新:根据 Leonid 的回答稍作修改,以下是按要求工作的解决方案:
template <typename T>
void foo_x(AConst<T> a) { std::cout << "foo AConst\n"; }
template <typename T>
void foo_x(AVar<T> a) { std::cout << "foo AVar\n"; }
template <typename T>
void foo(const T& a) { foo_x(AConst<T>(a));}
template <typename T>
void foo(T& a) { foo_x(AVar<T>(a));}
最佳答案
编译器无法推断出你的 T。
为了帮助他,简化参数类型:
template <typename T>
void foo(const T& a) { AConst<T> aa(a); std::cout << "foo AConst\n"; }
template <typename T>
void foo(T& a) { AVar<T> aa(a); std::cout << "foo AVar\n"; }
关于c++ - 推导函数调用时的歧义问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20139401/