读书人

关于typename的有关问题

发布时间: 2012-04-08 14:38:30 作者: rapoo

关于typename的问题
根据C++标准,表示一个模板内部类时应使用typename关键字,可以下代码通过了VS2005的编译

//用来表示有个内部类的类
class outer { public: class inner { }; };

//使用T的内部类
template <class T>
class Z
{
public:
void f()
{
T::inner nested_class; //并没有加入typename,可是编译通过了
typename T::inner nested_class2;
}
};

int main() {}

是编译器太智能,在模板分析期间就能判断一个变量是否是内嵌类?
还是编译器根本就没有分析模板,直到有代入模板参数后去分析具体的类?

谢谢各位指教!

[解决办法]
通过和不通过都很正常。编译器可以有这么高的智能的,但不是所有编译器都有这么高的智能。
这个问题,没必要深究。
[解决办法]
vs2005在这一点上是走在前面了。下一班标准可能会放松typename上的限制。
[解决办法]
楼主就不要计较这个问题了,咱们写代码就是要利用编译通过的,
如果通过了,并且符合你的意图,那就可以了。
如果没通过,那么这个时候就要加入typename声明了。

因为编译器只是一个别人写的工具,人家这么理解标准所以就这么设计这个编译器了。

关键是自己理解这个地方就行了(比如这里typename的作用就是为了消除歧义)
[解决办法]
大部分都能编译过去,起码g++ 和CC没问题
T::inner* nested_class; //并没有加入typename,可是编译通过了
这样定义的话,怎么解释?
是inneer静态变量与vnested_class的乘积。
试试看。

读书人网 >C++

热点推荐