【问题标题】:templated typedefs and inheritance模板化类型定义和继承
【发布时间】:2011-11-30 21:37:32
【问题描述】:

我想在我的基类中有一个 typedef 专门用于从这个基类派生的每个类。代码:

template<class X>
class SharedPointer
{
public:
    X* data;
    SharedPtr(X *val)
    {
        data = val;
    }
};

template<class T=Base> /* default type, I know this is a mistake. 
The reason to have this here is to just indicate that the default argument 
should be Base itself. so it'll have a Base type of shared pointer. */
class Base
{
public:
    typedef SharedPointer<T> MyTypeOfPtr;
    virtual MyTypeOfPtr Func()
    {
        Base *b = new Base;
        return MyTypeOfPtr(b);
    }
};

class Derived : Base<Derived>
{
public:
    MyTypeOfPtr Func()
    {
        Derived *d = new Derived;
        return MyTypeOfPtr(d);      
    }
};

main()
{
 Base b;
 Base::MyTypeOfPtr ptr1 = b.Func();
 Derived d;
 Derived::MyTypeOfPtr ptr2 = d.Func();  
}

但这不会编译。有没有办法拥有这个功能?

【问题讨论】:

  • 没有模板类型定义。什么具体不起作用?你想做什么,因为总有办法。
  • 请包含编译错误
  • @Taz_d 正如其他人所指出的,我们需要进一步澄清。就目前而言,任何人都可以做的就是猜测您的意图并做出一般假设。

标签: c++ oop templates inheritance


【解决方案1】:

您必须正确了解各种细节:

  • 拼写:“SharedPointer”还是“SharedPtr”?

  • 模板和类不是一回事,所以你不能有class T = BaseT 是一个类,Base 不是。此外,您不能让默认引用自身,因此即使 class T = Base&lt;T&gt; 也不起作用。删除默认类型。

  • 类继承默认是私有的,比如class Derived : public Base&lt;Derived&gt;

  • SharedPointer的构造函数设为public。

  • Base::Func() 没有意义;也许应该说new T

我应该认真建议您从更简单的示例开始,然后慢慢建立。

【讨论】:

  • 嗯,首先感谢您的回答。但是除了担心与主题完全无关的错误并提出“如何学习 C++”建议之外,您还有什么可以帮助我实现的目标吗?
  • @Taz_d:这取决于您要实现的目标。当您按照他的建议进行操作时,编译器错误都会消失:codepad.org/uDuSWULn,但我们无法确定您想使用 T 做什么。 Base 不需要模板化即可完成您想要实现的目标。
  • @MooingDuck:确实。我通过为每个列出的点应用一个修复程序精确地创建了代码的工作版本。
  • @Taz_d 但如果不是因为 Kerrek 指出的所有这些事情,答案会更容易。我无法回答,因为我真的不知道你的问题是关于什么的。
猜你喜欢
  • 2022-01-03
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 2020-06-26
相关资源
最近更新 更多