2013年3月27日 星期三

typename in C++ with gcc


一般在使用template, 不管在function或class, 需要注意要typename的使用
在Windows的Compiler或許不一定會用到(例如BCB), 但在gcc下 如果沒有謹慎使用
很容易出現error


#include <map>
using namespace std;
template <typename T>
bool Sample0(const T& t)
{
   T tgt=100;
   return tgt == t;

}

template <typename T>
bool Sample1(const T& t)
{
   //T::bar * p; /* error here*/
   typename T::bar * p;

}

struct TestType {
   typedef int bar;
};


template<typename T>
class Sample2{
public:
    typedef int size_type ;
    T m_A;
    void funcSample2()
    {
        map<T , int> mapSample2;
        //map<T, int>::iterator Sample2itr;  /* error here*/
        typename map<T, int>::iterator Sample2itr;
    }
};

template<typename T>
class Sample3 : public Sample2<T>
{
public:
    typedef typename Sample2<T>::size_type size_type;
    //typedef Sample2<T>::size_type size_type;  /* error here*/
    void funcSample3()
    {
        size_type abc = 0;
    }
};

int main() {
//Sample 0 一般簡易使用, 不需要typename
  int a=0;
  Sample0(a);

//Sample 1
   TestType x;
   Sample1(x);

//Sample 2
   Sample2<int> smp2;
   smp2.funcSample2();

//Sample 3
   Sample3<int> smp3;
   smp3.funcSample3();
}

因為:: scope operator 接在它後面的可以是成員變數、函數或是
物件類型。
如果不加上typename的話,編譯器可能會將bar/iterator/size_type 誤認為成員變數。
(實際上bar/iterator/size_type是一個物件類型)
所以要加上typename,讓編譯器知道這個東西是一個物件類型。

沒有留言:

張貼留言

文章分類