関数 foo の 2 つのバージョンを持つ次のコードがあります。AConst バージョンが呼び出されるように const が渡される場合は、AVar 型を取る foo に変数が渡されて呼び出されるようにしたいと思います。
#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));}