前天碰到一個問題,當時想著挺納悶的,不知道是什么原因.對"不能在模板聲明之外使用類型名稱"這樣的提示你會想到是什么?我在無意中按F1鍵看到MSDN中的描述才明白是typename關鍵字用錯了,是看它的英文描述才知道的:"typename cannot be used outside a template declaration".真想不到typename會翻譯為類型名稱.看來,以后有莫名其妙的錯誤還是得看英文的幫助文檔啊,不過最好一開始就有英文版的VS.NET.
以下是具體的描述:
namespace?code


{


enum?CodeType?
{?UTF_8,?UNICODE?};

template<?CodeType?srcT,?CodeType?desT?>

struct?ConvertType
{};

template<>
struct?ConvertType?<?UTF_8,?UNICODE?>


{
????typedef?char?srcType;
????typedef?wchar_t?desType;
};

template<?CodeType?srcT,?CodeType?desT?>

struct?Convert?
{};

template<>
struct?Convert<?UTF_8,?UNICODE?>


{
????//error?C2899:?不能在模板聲明之外使用類型名稱
????typedef?typename?ConvertType<?UTF_8,?UNICODE?>::srcType?srcType;????//!
????typedef?typename?ConvertType<?UTF_8,?UNICODE?>::desType?desType;????//!

};

}?//namespace?code



/**//*
這里根本不需要typename.
typename除用在模板聲明中外,只能用于說明模板類的成員是一個類型.
例如:
template?class?X?{};

//?Another?way
template?struct?X?{
????typedef?double?DoubleType;

????typename?X::DoubleType?a;???//?T::A?is?a?type
};

而如果不是模板類,則不能用typename.這時,它并不是多余的,而是一定不能要的.
例如:
template<>?struct?X?>?{
????typename?X::DoubleType?a;????//Error!?X?is?not?a?generic?class
????X::DoubleType?b;????????//OK!
};

我前面的代碼也是這樣的情況,ConvertType已經(jīng)是一個具體的類了,不要是模板類,所以ConvertType::srcType前不能加typename.

*/
以下是具體的描述:
































































