2014-10-26 109 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