次のようなコードがあります。
#include <iostream>
using namespace std;
template<typename T>
class Class
{
public:
Class() {}
void foo(T) {cout << "foo(T) is called \n";}
void foo(T&) {cout << "foo(T&) is called \n";}
};
int main()
{
Class<int> c;
int a = 1;
c.foo(1);
c.foo(a);
return 0;
}
関数の両方のオーバーロードがより効率的であるfoo
ため、関数のオーバーロードが必要ですが、引数としてリテラル定数を使用することはできず、リテラル定数に対しては機能しますが、ほど効率的ではありません。しかし、両方の関数を定義すると、 が実行されるタイミングがあいまいになります。foo(T&)
foo(T)
foo(T&)
c.foo(a)
エラー: オーバーロードされた 'foo(int&)' の呼び出しがあいまいです
どうすればこの問題を克服できますか?