2014-10-26 120 views
2

我有一个非模板类,模板成员函数类似于下面。模板成员函数继承

class Component 
{ 
public: 
static const int HASH_ID = 0; 
virtual int HashID() const {return Component::HASH_ID;} 
virtual bool is(int hash_id) const {return Component::HASH_ID == hash_id;} 
template<typename T> bool is() const {return this->is(T::HASH_ID);} 
}; 

class Transform : public Component 
{ 
public: 
static const int HASH_ID = 1; 
virtual int HashID() const {return Transform::HASH_ID;} 
virtual bool is(int hash_id) const {return Transform::HASH_ID == hash_id;} 
}; 

我的问题是,Transform类不会让我调用模板函数。

下面是测试代码,我写,不会编译

int main(void) 
{ 
    Transform test_component; 
    Transform* transform = &test_component; 
    Component* component = &test_component; 

    std::cout << component->is<Transform>() << std::endl; //No issues 

    //Won't compile unless I comment out this line 
    std::cout << transform->is<Transform>() << std::endl; //Says I am missing argument list 

    std::cout << transform->is(Transform::HASH_ID) << std::endl; //Works Fine! 
    return 0; 
} 

任何想法,为什么这不起作用?

+2

将此行添加到'Transform':'使用Component :: is;'。名称查找方式的工作原理是,'Transform :: is'隐藏基类中所有名为'is'的实体,无论是否使用匹配签名。 'using'声明将基类作用域中的名称带入'Transform'的作用域,所以它们不再被隐藏。长期来看,最好给两个不同的名字命名,否则你会一直打这个问题。 – 2014-10-26 17:34:47

+0

完美!我会做更多的测试,如果它需要一个新的名字,我会改变它。说得通。 – user2927848 2014-10-26 17:41:29

+0

@IgorTandetnik如果他给出了不同的名称,是不是会阻止派生类被多态使用? – 0x499602D2 2014-10-26 17:43:41

回答

2
virtual bool is(int hash_id) const {return Transform::HASH_ID == hash_id;} 

是隐藏

template<typename T> bool is() const {return this->is(T::HASH_ID);} 

如果一个派生类声明具有相同名称由基类中定义的方法的方法,所述派生类的方法隐藏基类的一个。

+1

是的,伊戈尔给出了上述适当的解决方案。从班级派生出来之前,从来没有遇到过这种名称的问题。需要使用“使用Component :: is;”然后它将取消隐藏它。 – user2927848 2014-10-26 17:44:26