我正在学习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;
};
如何解决?请转发任何有用的评论。
答案 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;
};