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