我读的文章周的老大师之一typename,#35。最后,您可以找到以下代码段:
Run Code Online (Sandbox Code Playgroud)#include <iostream> using std::cout; using std::endl; struct Rose {}; struct A { typedef Rose rose; }; template<class T> struct B : T { typedef typename T::rose foo; }; template<class T> void smell( T ) { cout << "awful" << endl; } void smell( Rose ) { cout << "sweet" << endl; } int main() { smell( A::rose() ); smell( B<A>::foo() ); }
我不明白 我的第一个猜测是,第二次smell调用导致模板smell被实例化,原因是您容易忽略了一些东西(笑话应该是什么,否则?!)。但是这两个调用都导致打印出“甜”字。毕竟这不是意料之中的吗?在中typedef Rose rose;,Rose不是依赖名称,所以很好。在typedef typename T::rose foo;,rose是依赖,而是typename减轻一点。我的问题:
这是Godbolt上代码段的精简版本。我测试了所有看起来旧的编译器(例如gcc-4.4.1,但请注意,以上代码段比早11年gcc-4.4.1)。
int*_*jay 10
您对代码的理解是正确的。这里的笑话是对莎士比亚的《罗密欧与朱丽叶》中的台词的引用:
名字叫什么?我们称其为玫瑰的
鲜花,闻起来很香。
这通常被解释为“任何其他名称的玫瑰都会闻起来很甜”。
或在此代码的情况下:
A::Rose,无论使用任何其他类型的名称,都仍可以smell()打印"sweet"。