1

论坛上有很多关于朋友和模板的话题。我在这里专门检查了这个:http: //www.parashift.com/c++-faq-lite/templates.html#faq-35.16

但是对这里的一段有点困惑:

当编译器在类定义中正确地看到友元行时,就会发生障碍。那时它还不知道友元函数本身就是模板;它假设它们是这样的非模板:

Foo<int> operator+ (const Foo<int>& lhs, const Foo<int>& rhs)
{ ... }

std::ostream& operator<< (std::ostream& o, const Foo<int>& x)
{ ... }

我必须承认我对编译器技术知之甚少。我在这里感到困惑的是,为什么像这样的类中的语句不足以说函数 operator+ 是模板函数?:

friend Foo<T> operator+ (const Foo<T>& lhs, const Foo<T>& rhs);

它有一个模板参数 T 和三角括号......我试图思考它除了模板函数之外还有什么其他类型。但我无法理解这一点。

我也对编译器所做的假设感到困惑。为什么它具体选择类型<int>?为什么编译做出这个假设而不是模板函数 - 这对我来说似乎更合理。

非常感谢,

4

1 回答 1

1

每当你在类中声明友元函数时,它是模板(之前声明的),你必须通过放置空尖括号或限定它来向编译器发出信号,声明的函数是模板,例如:

http://ideone.com/kmIfc

如果您也不这样做,那么如果没有先前声明的非模板函数,则声明的友元函数应该作为新函数的声明。

http://ideone.com/woIgn

于 2012-06-07T21:49:16.180 回答