朋友和模板C++

Friends and Templates C++

本文关键字:C++ 朋友      更新时间:2023-10-16

论坛中有很多关于好友和模板的帖子。我特意在这里检查了这个: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)
{ ... }

我必须承认,我对编译器技术了解不多。我在这里感到困惑的是,为什么像这样的类中的语句不足以说函数运算符+是一个模板函数?

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

它有一个模板参数T和三角形括号...我正在尝试思考除了模板功能之外,还可以是什么其他类型。但无法让我的思想通过这一点。

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

多谢

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

,例如:

http://ideone.com/kmIfc

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

http://ideone.com/woIgn