当模板化类的输入输出类型不同时,如何处理构造函数

时间:2017-12-26 03:51:06

标签: c++ constructor wrapper

我正在学习C ++很短的时间,以下问题让我很头疼。

我正在尝试做的是基本上包装现有的库而不会引入太多的开销,使得包装器库可以像现有库一样快地运行。因此,我倾向于不修改现有库中的任何内容。我这样做是为了使接口(语法)与我的旧代码兼容。

说,现有的类叫做BASE,它也是模板类。 有几种方法可以进行包装,例如继承。我决定选择将BASE作为Wrapper类的成员包括在内以便更好地封装。

        template<class T>    
        class Wrapper{
        public:
                     Wrapper() : base(){};
     /*error line*/  Wrapper( const Wrapper<double>& a, const Wrapper<double>& b ) : base(a.base, b.base){};
                    // constuct Wrapper<complex<double>> vector from two Wrapper<double> vectors using constuctor from existing class BASE
                    // 'a', 'b' are real and imag part respectively.

             private:
                     BASE<T>   base;
            }; 

以下行无法编译,错误消息是'base在上下文中声明为私有'

      /*error line*/  Wrapper( const Wrapper<double>& a, const Wrapper<double>& b ) : base(a.base, b.base){};

到目前为止我做过的实验:

&LT; 1 - 。变化

      private:
      BASE<T>   base;

      public:
      BASE<T>   base;

代码符合并给出正确答案。但是,正如我上面所说,我想要数据封装,所以这个解决方案是不行的。

&LT; 2。虽然错误消息表明存在与访问权限有关的问题,但我认为这是由不同的输入输出类型引起的(输入是两个“双”,输出是“复数双”的类型)。只要输入类型和(* this)的类型一致,下面的dosomething()函数就可以工作,没有关于'base在上下文中被声明为私有'的错误。

    template<class T>    
    class Wrapper{
    public:
                 Wrapper() : base(){};
 /*error line*/  Wrapper( const Wrapper<double>& a, const Wrapper<double>& b ) : base(a.base, b.base){};

     void dosomething(const Wrapper<T>& a)
     {
      (*this).base = a.base; // ok, compiles good
     }

         private:
                 BASE<T>   base;
        }; 

如何解决?请转发任何有用的评论。

1 个答案:

答案 0 :(得分:1)

您可以使用同一类但具有不同参数的类friend

template<class T>    
class Wrapper{
    template <typename U> friend class Wrapper;
public:
    Wrapper() : base(){}
    Wrapper(const Wrapper<double>& a, const Wrapper<double>& b) : base(a.base, b.base){}

private:
    BASE<T> base;
};