2017-05-25 7 views
7

template宣言テンプレートクラス内の関数

template <typename T> 
class Foo { 
public: 
    template <int x> 
    void bar() {} 
}; 

次コンパイル付:

void fooBar() 
{ 
    Foo<int> f; 
    f.bar<1>(); 
} 

が、次のことを行いません(と、「エラー:予想される前に、一次式 『)』トークン」GCC 5.4で.0と-std = C++ 14)。

template <typename T> 
void fooBar() 
{ 
    Foo<T> f; 
    f.bar<1>(); 
} 

たとえば、2番目のバージョンを明示的に呼び出すとします。

fooBar<int>(); 

その後、さらに第二のバージョンが無効である理由何らかの理由がある程度

"invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator<'". 

を文句gccの? gccがテンプレートパラメータリストの先頭ではなく演算子として '<'を扱うのはなぜですか?

+0

テンプレートであることを伝えることで、コンパイラを助けることができますか;'?それはどこに存在しますか? – alhadhrami

+0

@alhadhrami申し訳ありません - fooBarを読んでください。編集時に訂正されました。 – Matt

答えて

15

テンプレート機能を使用すると、コンパイラはFoo<T>は(Fooの専門分野があるかもしれません)になります正確に何を知らないので、それはそれはf.barは、メンバ変数であると仮定し、

f.bar < 1 
ようなコードを解析する必要があります

と続きます。

あなたが関数 `FOO <>()何bar

f.template bar<1>(); 
+0

これはうまくいきます。以前はこの構文を見たことがありませんでした。私はこれを試みることを決して考えなかったでしょう。ありがとうございました! – Matt

関連する問題