1

次のようなコードがあります。

#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&)' の呼び出しがあいまいです

どうすればこの問題を克服できますか?

4

1 に答える 1

2

const T&リテラル定数も受け入れるようにconst 参照で渡すか、右辺値のみを受け入れるように (リテラル定数T&&のように) 代わりに右辺値参照で渡すことができます。T

于 2016-03-02T19:27:17.693 に答える