c++ - 推导函数调用时的歧义问题

标签 c++ compiler-errors overloading ambiguous-call

我有以下代码,它有两个版本的函数 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/

相关文章:

rust - 如何从常量函数内部打印中间值以进行调试?

c++ - C++中的重载函数数组

c++ - 虚继承中的重载虚函数

c++ - 为什么我不能访问具有 protected 重载的公共(public)函数?

c++ - 如何保证准确的线程休眠间隔?

c++ - 使用 Boost 发送序列化结构但出现输入流错误

c++ - 了解 Matlab 中的 DEL2 函数以便用 C++ 对其进行编码

C#相当于C `system()`标准库函数

asp.net - .NET编译错误,显示用户友好屏幕

visual-studio-2010 - Subject.Subscribe 是否仅在静态实例中工作(或者我错过了什么)