我的代码存在问题(c ++)。我试着解释一下我需要什么。我有一个基类模板和两个方法不同的继承类。对于每个继承的类,我需要创建在另一个类中转换类的构造函数/方法。指出错误。
template < typename T > class A{
protected:
T **m;
void allocate_mem(T ***ptr){
*ptr = new T*[1];
(*ptr)[0] = new T[1];
}
public:
A(){
throw logic_error("Error!");
}
void renew(T val){
m[0][0] = val;
}
~A(){
delete[] m[0];
delete[] m;
}
T say_elem(){
return m[0][0];
}
};
template < typename T > class B: public A< T >{
public:
B(int val){
A<T>::allocate_mem(& this->m);
A<T>::m[0][0] = val;
}
B(const C &c){ //'C' does not name a type
//ISO C++ forbids declaration of 'c' with no type [-fpermissive]
A<T>::allocate_mem(& this->m);
A<T>::m[0][0] = A<T>::c.say_elem();
}
};
template < typename T > class C: public A< T >{
public:
C(double val){
A<T>::allocate_mem(& this->m);
A<T>::m[0][0] = 1;
}
C(const B &b){ //'B' does not name a type
//ISO C++ forbids declaration of 'b' with no type [-fpermissive]
A<T>::allocate_mem(& this->m);
A<T>::m[0][0] = A<T>::b.say_elem();
}
};
我该怎么办?谢谢你的帮助!
答案 0 :(得分:1)
要修复“不命名类型”错误,请尝试向前声明您的类(即,将以下行放在文件的顶部)。
template < typename T > class A;
template < typename T > class B;
template < typename T > class C;
然后将此:B(const C &c)
更改为:B(const C<T> &c)
,对于C构造函数也是如此。
以下代码为我编译:
template < typename T > class A {
protected:
T **m;
void allocate_mem(T ***ptr){
*ptr = new T*[1];
(*ptr)[0] = new T[1];
}
public:
A() { throw logic_error("Error!"); }
void renew(T val) { m[0][0] = val; }
~A() {
delete[] m[0];
delete[] m;
}
T say_elem() { return m[0][0]; }
};
template < typename T > class C;
template < typename T > class B: public A< T >{
public:
B(int val) {
A<T>::allocate_mem(& this->m);
A<T>::m[0][0] = val;
}
B(const C<T> &c) {
A<T>::allocate_mem(& this->m);
A<T>::m[0][0] = A<T>::c.say_elem();
}
};
template < typename T > class C: public A< T >{
public:
C(double val) {
A<T>::allocate_mem(& this->m);
A<T>::m[0][0] = 1;
}
C(const B<T> &b) {
A<T>::allocate_mem(& this->m);
A<T>::m[0][0] = A<T>::b.say_elem();
}
};
答案 1 :(得分:1)
前向声明答案几乎是正确的,但前向声明不能指定父类。转发声明如下:
template < typename T > class A;
template < typename T > class B;
template < typename T > class C;
答案 2 :(得分:0)
您的类之间存在一些循环依赖关系。至少你需要提供一些类的前向声明。即便如此,由于方法声明顺序,您可能需要更改对指针的引用。