类继承和类原型的问题

时间:2015-09-28 23:45:57

标签: c++ inheritance prototyping

在下面的简化代码中,我在VS中尝试在typedef语句中没有发生错误,因为它没有在该语句中识别B并且会给出错误"缺少' ;'之前'<'"。

template<class DT>
class A{
    typedef B<DT> iterator;
}

template<class DT>
class B{
    friend A<DT>;
}

我理解插入B的类原型应该可以解决这个问题(来源:Class prototyping)但是我仍然发现VS在进入typedef语句之前并没有认识到B存在,并且仍然吐出相同的语法错误

class B; //prototype of B
template<class DT>
class A{
    typedef B<DT> iterator;
}

template<class DT>
class B{
    friend A<DT>;
}

并且在将布置切换为首先分配B然后A,并将其改为具有A的类原型的情况下,因为A应该是B的朋友,但是编译器不知道B还存在。我得到了错误,即缺少&#34;类模板A的参数列表&#34;。

class A; //prototype of B
template<class DT>
class B{
    friend A<DT>;
}`
template<class DT>`
class A{
    typedef B<DT> iterator;
}

然后调查那个错误(来源:Argument list for class template is missing)我发现你将声明更改为采取&#39;&#39;并添加声明&#39;模板&#39;在那上面。这解决了两个类之间的继承问题,但是这会导致在测试功能时我们的类A的方法(在我的详细代码中)无法访问。关于我应该如何保持这种继承相同而不是使A类变为纯虚拟,无法从其他来源(.cpp)访问的任何想法?

2 个答案:

答案 0 :(得分:1)

这应该适合你:

template<class DT> class B;

template<class DT>
class A{
    typedef B<DT> iterator;
};

template<class DT>
class B{
    friend A<DT>;
};

答案 1 :(得分:0)

我在详细代码中发现的是,我在定义我的类时添加了<DT>的不必要实例,即template <class DT> class AbstractLinkedList<DT> { ... },所以当我尝试按照Ishmael的建议进行操作时,以及安德烈评论完整模板类原型,编译器只识别第一个实例,而不是第二个滚雪球其他错误。在取出那些额外的<DT>时,类继承已经达成一致,所以使用我的问题中使用的简化代码,我的工作代码就是

template<class DT> class A;

template<class DT>
class B{
    friend A<DT>;
};

template<class DT>
class A{
    typedef B<DT> iterator;
};