2017-02-12 5 views
1

クラステンプレート内のオブジェクトのメンバ関数を呼び出そうとしていますが、次のコードをコンパイルできません。私はobject.template method<T>();を使用できると言った投稿hereを見つけました。 MSVC 2015を使用してテンプレートメンバ関数を呼び出す

は、私はエラーC2059を取得する:構文エラー: 'テンプレート'

#include <iostream> 

class Bar 
{ 
public: 
    Bar() : m_x(0.f) { } 
    ~Bar() { } 

    void setX(double x) { m_x = x; } 
    void printX(void) { std::cout << m_x << std::endl; } 

private: 
    double m_x; 
}; 

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

    void setBar(T bar) { m_bar = bar; } 
    void printBar(void) { m_bar.template printX<T>(); } // This is the issue 

private: 
    T m_bar; 
}; 

int main() 
{ 
    Bar bar; 
    bar.setX(20.f); 
    bar.printX(); 

    Foo<Bar> foobar; 
    foobar.setBar(bar); 
    foobar.printBar(); 

    return 0; 
} 
+4

書かれているように、Barにはテンプレート化されたメンバー関数がないようです。 –

+0

あなたが提供したリンクは、呼び出されているメンバ関数がテンプレートメンバ関数である場合にのみ関連します。実際、 'printX'はテンプレートメンバ関数でも、クラステンプレートのメンバでもありません(' Bar'はテンプレートクラスではありません)。要するに、そのリンクはあなたが実際に抱えている問題とは関係ありません。 – WhozCraig

答えて

1

あなたの機能printXは、メンバテンプレート関数ではありません。なぜそれをテンプレートと呼ぶのですか?

//       ,--- Not a template, so you must use 
//       v You must use the function like any other function 
void printBar(void) { m_bar.printX(); } 

テンプレートキーワードは、依存型のメンバー関数テンプレートで使用されます。関数printXがテンプレートであって、控除の代わりにテンプレート引数を指定したい場合、構文はあなたが言及した質問の例を好きにします。

+0

愚か私は、最初からテンプレートから関数を呼び出そうとすると、 "T"にそのメソッドがあることを知らないのでエラーが発生すると想定しました。あなたの助けてくれてありがとう、私は仮定を外し、ただ試してみる必要があります。 – user2278611

関連する問題