胡说八道

学而不思则罔,思而不学则殆

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::
    今天在<<C++ Templates>>看到一个奇怪的用法
 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>>说这里如果不声明后面的是模板函数的话,编译器会把<当作小于号,报错.
 >>

posted on 2004-12-29 11:33  胡说八道  阅读(1628)  评论(0)    收藏  举报