2017-02-12 148 views
1

我想调用类模板中对象的成员函数,但是我无法获得以下代码来编译。我发现一个帖子here,说我可以使用object.template method<T>();调用模板成员函数

使用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

您提供的链接仅在被调用的成员函数是模板成员函数时才有用,该函数是* not *。实际上,'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