2011-09-13 20 views
21

免責事項:次の質問はおそらくとても簡単で、私は最初の答えを見てショックを受けるかもしれません。さらに、重複した質問についてはお詫びしたい。構文上の問題は、口頭での説明であることを特定するのが必ずしも容易ではないので、それらを検索するのは簡単ではない...テンプレートクラス内のテンプレート関数を呼び出す

しかし、 2つのテンプレートクラスがあり、そのうちの1つにテンプレートメンバー関数があり、もう1つのクラスはその関数を呼び出そうとします。最小限、エラー製造例を以下に示す:コンパイル時に

#include <iostream> 

template <typename T> 
class Foo { 
public: 
    Foo() { 
    } 

    template <typename outtype> 
    inline outtype bar(int i, int j, int k = 1) { 
     return k; 
    } 

}; 

template <typename T> 
class Wrapper { 
public: 
    Wrapper() { 
    } 

    double returnValue() { 
     Foo<T> obj; 
     return obj.bar<double>(1,2); // This line is faulty. 
    } 

}; 

int main() { 
    Wrapper<char> wr; 
    double test = wr.returnValue(); 
    std::cout << test << std::endl; 
    return 0; 
} 

、これはすべてのエラーメッセージがコードでマークリンケに向けられ

expected primary-expression before 'double' 
expected ';' before 'double' 
expected unqualified-id before '>' token 

もたらします。

あなたのアイデアは、どれほど明白であっても、私はすでにあなたに感謝しています。

+0

設定が推測できないため、明示的な資格が必要です。テンプレートがなければ、構文エラーが発生します。なぜなら、演算子は以下のように認識されるからです....「13.6。Stroustrup、spec。edition。935-936」のlanguage authorの観点も参照してください。 – bruziuz

答えて

4

よくあること:質問が投稿されると、回答はすべて単独で行われました。

return obj.template bar<double>(1,2); 

に障害のあるラインを修正 期待される結果が得られます。 objにテンプレートパラメータTに依存タイプFoo<T>のインスタンスであり、そのため上記記述する必要がありますようtemplateキーワードは、ここで必要とされる

3

これはfoo.template bar‹ double >の場合だろうか?

関連する問題