【发布时间】:2016-05-08 14:50:14
【问题描述】:
我遇到了一个真正的问题,可以这样总结:
template <typename BaseType>
class TemplateClass
{
public:
template <typename BaseTypee, unsigned PrefixID>
static void deleteType(unsigned int ObjID)
{
}
};
class ParentClass:
public TemplateClass<ParentClass>
{
};
class ChildClass:
public ParentClass, public TemplateClass<ChildClass>
{
using TemplateClass<ChildClass>::deleteType; //Ambigious Symbol Compiler-Error
};
我这样调用函数deleteType:
TemplateClass<ChildClass>::deleteType<ChildClass, ChildType>(ChildType);
我想在ChildClass类中调用deleteType函数,但是没有任何声明,该函数将在ParentClass中调用。 p>
如何消除使用短语中的模棱两可的符号错误?可以用不同的方法完成我的任务吗?
仅供参考:最初,我尝试使用(没有任何变化)调用该函数
ChildClass::deleteType<ChildClass, ChildType>(ChildType);
有趣的事情:它仍然编译虽然有一个红色的下划线。如果我调试,模板仍然会在 ParentClass 中被调用,在编译时没有警告也没有错误抛出..
【问题讨论】:
-
ChildClass::TemplateClass<ChildClass>::deleteType<ChildClass, ChildType>(ChildType); -
你有两个完全不同的、不相关的模板参数,它们都命名为
BaseType,你的deleteType依赖它们。一个是TemplateClass的参数,另一个是deleteType的参数。总的来说,deleteType依赖于三个模板参数,其中一个与另一个命名相同,并被另一个遮蔽。你可能不希望这样。 -
请提供可编译代码、预期输出和实际输出(在相关函数中添加输出语句)。完全不清楚您希望代码做什么。如果你说“我希望它打印 X,但它打印 Y”,那就没有回旋的余地了。
标签: c++ templates inheritance crtp