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

How to deal with constructor when input-output type is different for templated class

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

我想做的是在不引入太多开销的情况下包装一个现有的库,这样包装器库就可以 运行 和现有的库一样快。因此,我倾向于不修改现有库中的任何内容。我这样做是为了使界面(语法)与我的旧代码兼容。

比如说,现有的class叫做BASE,也是模板化的class。 有几种方法可以进行包装,例如继承。为了更好的封装,我决定选择将 BASE 作为 Wrapper class 的成员。

        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 is declared as private within the context'

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

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

<1>。变化

      private:
      BASE<T>   base;

      public:
      BASE<T>   base;

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

<2>。虽然错误消息表明与访问权限有关,但我认为这是由不同的输入输出类型引起的(输入是两个 "double",输出是 "complex double" 的类型)。下面的dosomething()函数只要输入的类型和(*this)的类型一致,就不会出现关于'base is declared as private within the context'的错误。

    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;
        }; 

如何解决?期待任何有用的评论。

您可以使 class friend 相同 class 但参数不同:

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;
};