2017-02-12 4 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(); } 

종속 키워드의 멤버 함수 템플릿에는 template 키워드가 사용됩니다. 함수 printX이 템플리트이고 공제 대신 템플리트 인수를 지정하려는 경우, 구문은 앞서 언급 한 질문의 예제를 원할 것입니다.

+0

어리석은 저, 저는 처음부터 템플릿에서 함수를 호출하려고하면 "T"에 그 메소드가 있다는 것을 알지 못하기 때문에 에러가 발생한다고 가정했습니다. 도움을 주셔서 감사합니다, 나는 가정을 해고 그냥 물건을 시도해야합니다. – user2278611