2011-01-03 10 views
6

次のコードスニペットは、私の作品:メンバー関数テンプレートと演算子オーバーロード()C++で

class Foo { 
public: 
    template <class T> T& get() { ... } 
}; 

Foo foo; 
foo.get<int>() = ...; 

ただし、次のコードスニペットは、私のために動作しません:

class Foo { 
public: 
    template <class T> T& operator()() { ... } 
}; 

Foo foo; 
foo<int>() = ...; 

エラーある:

expected primary-expression before '>' token 
expected primary expression before ')' token 

両方の誤差がfoo<int>()

を参照

なぜこれが機能しないのですか?これを修正することは可能ですか?あなたが明示的にテンプレート引数を指定する必要がある場合

+1

あなたのテンプレート 'operator()'は、インスタンス化が戻り値でのみオーバーロードされるため、かなり使用できません。 'get'などの名前を使用してください。 – aschepler

+0

これは使用できません(ただし、これはあまり好ましくありません)。以下の答えを見てください。 –

+0

なぜ、クラス全体ではなく、関数をテンプレート化していますか?私がする必要がないので、 –

答えて

10

は、あなたがoperator構文を使用する必要があります:

foo.operator()<int>() 

関数呼び出し構文を使用して引数を指定する方法がありません。関数の引数からテンプレート引数を推測できない場合は、演算子のオーバーロードよりもメンバ関数を使用する方がよいでしょう。

+0

ああ、確かにありがとう。今は理にかなっている。 – Dan

-1

また、あなたがこの

class Foo { 
public: 
    template <class T> operator T&() { ... } 
}; 

を行うことができますそして、それは自動的に「戻る」タイプに応じて、右の関数を呼び出します:

Foo foo; 
int i=foo; 

私はほとんどの人がこれを好きではないことを知っています呼び出されている関数は戻り値の型に依存しますが、構文を掃除するための偉大な「トリック」があります。

+3

追加警告:誤って意図しないタイプの「変換」メソッドをインスタンス化するのは簡単です。 – aschepler

+2

これはコードをひどく複雑にするトリックだと思います。 *任意のタイプの変換演算子を提供しています...それは、あなたがそれを期待したり、実現したりしない可能性が最も低い場所であなたを襲うでしょう! –

1

問題は、テンプレートパラメータリストが間違った場所にあることです。テンプレートの引数がintfooというオブジェクトまたは関数を使用しようとしているようですが、実際にはテンプレートパラメータリストを表示するのはoperator()です。

残念ながら(おそらくそうであっても、少なくとも)、これを回避する方法はありません。

class Foo { 
public: 
    template <class T> T& operator()() { ... } 
}; 

Foo foo; 
foo.operator()<int> = ...; 

これが役立つことを願っています。

関連する問題