一般在使用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,讓編譯器知道這個東西是一個物件類型。
沒有留言:
張貼留言