当模板化的输入输出类型不同时如何处理构造函数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;
};
我学习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;
};