2

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

4 回答 4

1

编译器无法推断出你的 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";   }  
于 2013-11-22T09:45:36.330 回答
0

您可以像这样将完整的类模板传递给函数

#include <iostream>

template <typename T>
struct AConst
{
    AConst(T x) :t(x){ std::cout << "AConst\n"; }
    const T t;
};

template <typename T>
struct AVar
{
    AVar(const T& x) :t(x){ std::cout << "AVar\n"; }
    const T& t;
};

template <typename T1>
void foo(T1 a){}

int main()
{
    int i = 2;

    foo<AConst<int>>(1);
    foo<AVar<int>>(i);

    return 0;
}
于 2013-11-22T07:48:14.220 回答
0

使用强制转换来消除歧义错误。在这种情况下,如果我没记错的话,您可以将“1”作为 AConst。我不记得转换为模板类型的确切语法......可能是这样的:

foo( (AConst<int>) 1); .. or something to that effect.
于 2013-11-22T07:42:22.470 回答
0

编译器无法选择合适的函数。您可能想要声明 2 个具有不同名称的函数:

template <typename T>
void fooConst(AConst<T> a) { std::cout << "foo AConst\n"; }

template <typename T>
void fooVar(AVar<T>   a) { std::cout << "foo AVar\n";   }

或者,您可以选择以这种方式使用您拥有的功能:

int main()
{
   int i = 2;

   foo(AConst<int>(1));
   foo(AVar<int>(i));

   return 0;
}

通常,您没有向编译器提供足够的信息。你是唯一知道应该在主函数中使用什么实例的人。可能,如果您更详细地描述此代码的目的是什么,则解决方案会更具体。

于 2013-11-22T07:43:06.760 回答