【发布时间】:2011-07-23 20:24:23
【问题描述】:
声明模板函数友元涉及一些非常不直观的语法,即使对于 C++ 也是如此!为所需的额外<> 选择语法的理由是什么?使用template 关键字不是更有意义吗?
对于那些不知道的人,这里有一个你可以尝试做的例子:
template <typename T>
class Foo
{
int x;
friend void bar(Foo<T>);
};
template <typename T>
void bar(Foo<T> f)
{
std::cout << f.x;
}
如果你尝试调用bar(Foo<T>()),你会得到链接器错误。
要解决这个问题,您必须转发声明 bar(因此是 Foo),然后在朋友声明中粘贴一个奇怪的 <>。
template <typename T> class Foo;
template <typename T> void bar(Foo<T>);
template <typename T>
class Foo
{
int x;
friend void bar<>(Foo<T>); // note the <> (!?)
};
template <typename T>
void bar(Foo<T> f)
{
std::cout << f.x;
}
我的问题是,<> 语法背后的基本原理是什么?使用template 关键字或类似的东西不是更直观吗?
编辑:澄清一下,我已经知道 为什么 是必需的,我想知道的是为什么他们选择使用 来消除歧义,而不是使用其他更直观的方法语法。
【问题讨论】:
-
+1 我一直在想这个问题。在“Effective C++”中有关于这个的讨论,但我不太明白。
-
我希望这个不直观的东西在 c++11 中变得直观
-
@Hades:除非我错过了,否则 C++11 在这方面没有任何改变。
标签: c++ templates syntax friend