#include <iostream>
class MyClass {
public:
template <typename U>
friend class MyTemplateClass<U>;
};
int main() { return 0; }
上面提供的代码尝试将 MyTemplateClass 声明为 MyClass 的友元类。 但是,当编译器将其误解为“模板类 MyTemplateClass”的特化时,问题就出现了,这显然不是有意的?
这有效:
template <typename U>
friend class MyTemplateClass;
我不明白为什么会声明一个类型变量U,但不会在友元声明中使用它,如果目的是表明MyTemplateClass是一个模板类,那为什么我们不能直接使用它:
template <>
friend class MyTemplateClass;
这是模板特化声明的语法:
template <typename U>
class MyTemplateClass<U>;
您将该语法用于友元模板专业化,因此从编译器的角度来看,您想要一个没有模板声明就无法出现的模板专业化。
这有效:
template <typename U>
friend class MyTemplateClass;
只能设置一定数量的模板参数,没有名称
template <typename>
friend class MyTemplateClass;