template<typename T>
class Shell {
public:
template<int N>
class In {
public:
template<int M>
class Deep {
public:
virtual void f();
};
};
};
template<typename T, int N>
class Weird {
public:
void case1(Shell<T>::template In<N>::template Deep<N>* p) {
p->template Deep<N>::f(); // inhibit virtual call
}
void case2(Shell<T>::template In<T>::template Deep<T>& p) {
p.template Deep<N>::f(); // inhibit virtual call
}
};
其中p->template Deep<N>::f();看得我头疼啊.还得继续看呀.
<<
终于找到了这种用法的说明
class Memory
{
public:
template<typename T>
T* get_new();
};
template<typename T>
void f(T& t)
{
int *pl=t.template get_new<int>();
//int *pl=t.get_new<int>();
}
//例子改自<<The C++ Programming Language>>,我在VC7.1上发现不需要声明也能正确通过.应该是编译器做的不错.不知道谁还有更好的例子?
<<The C++ Programming Language>>说这里如果不声明后面的是模板函数的话,编译器会把<当作小于号,报错.
>>