【问题标题】:Template multiple inheritance ambigious symbol error模板多重继承歧义符号错误
【发布时间】: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&lt;ChildClass&gt;::deleteType&lt;ChildClass, ChildType&gt;(ChildType);
  • 你有两个完全不同的、不相关的模板参数,它们都命名为BaseType,你的deleteType 依赖它们。一个是TemplateClass的参数,另一个是deleteType的参数。总的来说,deleteType 依赖于三个模板参数,其中一个与另一个命名相同,并被另一个遮蔽。你可能不希望这样。
  • 请提供可编译代码、预期输出实际输出(在相关函数中添加输出语句)。完全不清楚您希望代码做什么。如果你说“我希望它打印 X,但它打印 Y”,那就没有回旋的余地了。

标签: c++ templates inheritance crtp


【解决方案1】:

将您的 using 声明放在 public: 部分:

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>
{   
public:
    using TemplateClass<ChildClass>::deleteType;
};

int main() {
    ChildClass::deleteType<void, 0>(0);
}

【讨论】:

  • TemplateClass 仍将带有红色下划线,并带有相同的错误:Ambigious Symbol 'TemplateClass::deleteType',有趣的是:尽管有红色下划线,但它仍然可以编译。如果我调试,模板仍将在 ParentClass @Johan Boule 中调用
  • 你使用什么编译器/IDE?
  • 它现在运行正常,我在深度实现中遇到了析构函数的一些问题。您的解决方案是正确的 :-) 问候
猜你喜欢
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
  • 2013-10-17
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 2015-06-27
相关资源
最近更新 更多