繁体   English   中英

具有模板构造函数的C ++模板类

[英]C++ template class having constructor with template

所以,我有一些基本的A级是这样的:

template<class T1>
class A {
public:
    X* x;

    template <class T2>
    A(const A<T2> &a) {
        x = new X(a->x);
    }
};

T1和T2都是从X继承的类型。但是,此代码不起作用,我真的不明白如何编写它,以便构造函数能够使用可能带有不同模板参数的另一个A。

为了明确起见,我想编写一个take的构造函数,它可以采用带有不同模板参数的A。 (代码按原样进行编译,模板部分似乎并未按我希望的方式工作)。

我想要做的是:(其中YZ都从X继承)

A<Z> a1;
A<Y> a2(a1);

任何帮助都非常感谢!

抱歉,我认为我可以创建一个很好的示例 ,而不必使用我的实际代码,但是似乎我在语法上有点失败,所以这是我的真实类的缩写:

template <class T>
class Calendar {
private:
    Date *d;
public:
    template <class T2>
    Calendar(const Calendar<T2> &c) {
        d = new T(c.view_date_component());
    }
    Calendar();
    ~Calendar();
    const Date& view_date_component() const;
};

template <class T>
Calendar<T>::Calendar() {
    d = new T();
}

template <class T>
Calendar<T>::~Calendar() {
    delete d;
}

template <class T>
const Date& Calendar<T>::view_date_component() const {
    return *d;
}

首先,您还需要定义一个默认构造函数。 其次,您必须使模板类成为其自身的朋友才能访问私有成员变量x。 第三,在模板构造函数中,您要传递a as const引用。 因此,您不能使用-> (即,箭头运算符)访问它的成员,而是使用. (即点运算符)。

template<class T1>
class A {
  X* x;
 public:
   A() = default;
   ^^^^^^^^^^^^^^
   template <class T2>
   A(const A<T2> &a) {
     x = new X(*(a.x));
               ^^^^^^
   }

  template<class T2> friend class A;
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
};

现场演示

如果仅在T1T2X继承时才希望唤起模板构造函数:

template <typename T2, 
typename = typename std::enable_if<std::is_base_of<X, T1>::value && 
                                   std::is_base_of<X, T2>::value>::type>
A(const A<T2> &a) {
    x = new X(*(a.x));
}

现场演示

如果要检查T2扩展X还是扩展T1,可以将SFINAE与std :: is_base_of一起使用

template <class T2, typename = std::enable_if_t<std::is_base_of<X, T2>>>
A(const A<T2> &a) {
    x = new X(a->x);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM