C ++:朋友模板类/模板非类型参数

时间:2014-08-11 07:39:15

标签: c++ class templates friend non-type

我想实现通用图表类,我仍然遇到问题,这些问题缩小到以下代码:

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


template <class T> class A
{
private:
    std::vector<B<T> *> myBs;
};


class C { };

除非我做这样的事情,否则编译得非常好:

B<C> myB;

...导致以下错误:

B.h: In instantiation of ‘class B<C>’:
In file included from A.h:12:0,
             from main.cpp:16:
main.cpp:30:10:   required from here
B.h:15:1: error: ‘class C’ is not a valid type for a template non-type parameter
{
^
B.h:11:11: error: template parameter ‘class T’
template <class T> class A;
          ^
B.h:16:31: error: redeclared here as ‘<declaration error>’
template <T> friend class A;

我的想法是完全错的,我是否遗漏了某些东西,或者这样的构造是不可能的,凌乱的,奇怪的还是非常可怕的事情?

2 个答案:

答案 0 :(得分:3)

问题是你的friend声明。我建议你首先声明A类,然后使用更简单的friend声明。像

template<class T> class A;

template<class T>
class B
{
    friend A<T>;
    ...
};

答案 1 :(得分:1)

问题是,您是否只想A<T>成为B<T>的朋友。 然后使用Joachim的解决方案!

如果你想让任何A成为朋友,那么你需要这样做:

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