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;
}
任何想法,爲什麼這不起作用?
將此行添加到'Transform':'使用Component :: is;'。名稱查找方式的工作原理是,'Transform :: is'隱藏基類中所有名爲'is'的實體,無論是否使用匹配簽名。 'using'聲明將基類作用域中的名稱帶入'Transform'的作用域,所以它們不再被隱藏。長期來看,最好給兩個不同的名字命名,否則你會一直打這個問題。 – 2014-10-26 17:34:47
完美!我會做更多的測試,如果它需要一個新的名字,我會改變它。說得通。 – user2927848 2014-10-26 17:41:29
@IgorTandetnik如果他給出了不同的名稱,是不是會阻止派生類被多態使用? – 0x499602D2 2014-10-26 17:43:41