【发布时间】:2017-12-26 03:51:05
【问题描述】:
我学习 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 is declared as private in the context'
/*error line*/ Wrapper( const Wrapper<double>& a, const Wrapper<double>& b ) : base(a.base, b.base){};
到目前为止我所做的实验:
。改变
private:
BASE<T> base;
到
public:
BASE<T> base;
代码符合并给出正确答案。但是,正如我上面所说,我想要数据封装,所以这个解决方案是不行的。
。尽管错误消息表明与访问权限有关,但我认为这是由不同的输入输出类型引起的(输入是两个“双”,输出是“复双”类型)。只要输入的类型和 (*this) 的类型一致,以下 dosomething() 函数就可以工作,没有关于“在上下文中将基声明为私有”的错误。
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;
};
如何解决?期待任何有用的 cmets。
【问题讨论】:
标签: c++ constructor wrapper