声明模板友好类的两种方法?

时间:2011-08-07 03:24:53

标签: c++ templates

template<typename T> class FooBar {};

template<typename T> class Bar {
    friend class FooBar<T>;
};

template<typename T> class Bar2 {
    template friend class FooBar<T>;
};

Class Bar和Bar2有什么区别?

2 个答案:

答案 0 :(得分:8)

根据我的编译器,你拥有的第二个语法是无效的语法。如果您将其更改为:

template<typename T> class FooBar {};

template<typename T> class Bar {
    friend class FooBar<T>;
};

template<typename T> class Bar2 {
    template<typename T2> friend class FooBar;
};

然后它会编译。区别在于Bar<T>,只有FooBar<T>是朋友;如果您有Bar<int>,则只有FooBar<int>是朋友,而不是FooBar<char>或除int之外的任何其他类型。在Bar2<T>中,任何类型的FooBar都是朋友。

答案 1 :(得分:1)

如果Bar2类定义被修改如下

template<typename T> class Bar2 {
    template<typename U> friend class FooBar<U>;
};

然后,任何类型的FooBar都是任何类型的Bar2的朋友。

但是Bar类定义告诉我,类型为T的FooBar是同类型Bar的朋友。即Bar&lt; char&gt; &安培; FooBar的&LT; char&gt;而不是Bar&lt; int&gt; &安培; FooBar的&LT; char&gt;

词shash