【问题标题】:C++, copy constructor implementation, default templates parametersC++,复制构造函数实现,默认模板参数
【发布时间】:2012-02-15 18:23:05
【问题描述】:

首先,我为稍长的示例代码和问题道歉……共有三个类 A、B、C(其中 A 和 B 是抽象的)。

A 类表示一个容器,用于存储不同类型的 Item 对象。

template <typename Item>
struct TList {typedef std::vector <Item> Type;};

template <typename Item>
class A
{
protected:  typename TList <Item>::Type items;
            A() : items ( 0 ) {}
            virtual ~A() = 0 {}
};

派生类 B 包含具有一些附加功能的 Item* 特化,并具有 TD 的默认参数。

typedef enum { D1, D2} TD;

template < typename T, const TD td = D1 >
class B;

template <typename Item, const TD td>
class B <Item *, td> : public A <Item *>
{
    public:
            B () : A <Item *> () {}

    template <const TD td2>
    B ( const B <Item *, td2> & source )
    {
        if ( this != &source ) { //Code } //Error
    }

    virtual ~B() = 0 {}  
};

C 类不是抽象的,它包含另一个附加功能(未包含在代码中)。

template < typename T, const TD td = D1 >
class C;

template <typename Item, const TD td>
class C <Item *, td> : public B <Item *, td>
{
    public:
            C() : B <Item *, td> () {}

    template <const TD td2>
    C ( const C <Item*, td2 > &source ) : B  <Item*, td> ( source ) {}     
};

如果我试图创建 C 类的两个对象。如果默认参数是类型,那么一切正常。

int main()
{
C <Test <double> *, D1 > t1;
C <Test <double> *, D1 > t2(t1);
}

但如果两个参数的类型不同

int main()
{
C <Test <double> *, D1 > t1;
C <Test <double> *, D2 > t2(t1);
}

编译器停在行

if ( this != &source ) { //Code } //Error

出现以下错误:

Error   1   error C2446: '!=' : no conversion from 'const B<T,td> *' to 'B<T,td> *const 

我对代码的问题:

1)在哪里(在哪些类中)以及如何为TD的不同模式实现复制构造函数。

2) TD的不同参数在哪里(在哪些类中)以及如何实现operator =。

3) 在哪里(在哪些类中)实现析构函数。

非常感谢您的帮助。

【问题讨论】:

    标签: c++ templates default-value copy-constructor


    【解决方案1】:

    B<... d1> 和 B<... d2> 是完全不同的类,不能将一个复制到另一个。 如果您真的想将 B<... d1> 对象复制到 B<..l. d2> 对象中,也许您应该编写一个模板复制函数。

    【讨论】:

      【解决方案2】:

      问题是你不能比较不同类型的指针。您应该删除 this != &amp;source 行,因为不同类型的对象无论如何都不相等,并为 td == td2 情况实现另一个适当的复制构造函数。

      template <const TD td2>
      B (const B<Item*, td2>& source)
      {
          // code
      }
      
      B (const B& source)
      {
          // code
      }
      

      【讨论】:

      • @KennyTM:我忘了这两个对象是不同类型的。感谢您的帮助。
      猜你喜欢
      • 2016-03-01
      • 2011-07-15
      • 2011-03-27
      • 1970-01-01
      • 2012-06-22
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多