C++類中typedef關鍵字的使用
阿新 • • 發佈:2021-01-24
技術標籤:嵌入式Linux應用開發c++
一、在C中使用typedef關鍵字:是為了給內建型別或使用者自定義資料型別定義符號名稱,typedef是由編譯器執行解釋的,比如:
typedef unsigned char Name;
typedef struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
} Book;
這樣之後識別符號Name可以作為型別unsigned char的縮寫,Book可以作為結構體struct Books的縮寫,可以定義新變數Name c或Book mybook等等。
二、在C++中使用typedef關鍵字:同樣是由編譯器執行解釋的;並且在class類中使用時具有public和private許可權,通過限制該類型別名的作用域來防止衝突;在public作用域下,可以在類外使用該類型別名,但必須使用::作用域符號。在函式內部使用typedef時,這個別名在函式體外是不可使用的。
class demo_a { public: typedef int VALUE; VALUE getValue() const; private: VALUE value; }; demo_a::VALUE demo_a::getValue() const { std::cout << "demo_a::getValue()" << std::endl; return value; } int main() { demo_a obj_a; obj_a.getValue(); system("pause"); return 0; }
三、在C++類模板中使用typedef,由於typedef關鍵字是由編譯器解釋執行,但是類模板在沒有例項化之前不經過編譯器解釋,而typedef定義型別轉變的時候必須是確定的型別,所以使用時要格外注意。
template<typename T> class demo_b { public: typedef T VALUE; VALUE getValue() const; private: VALUE value; }; template<typename T> demo_b<T>::VALUE demo_b<T>::getValue() const { std::cout << "demo_b::getValue()" << std::endl; return value; } int main() { demo_b<int> obj_b; obj_b.getValue(); system("pause"); return 0; }
這樣編譯時會報“依賴名稱不是型別”的錯誤,具體如下:
解決的辦法是:在函式demo_b<T>::VALUE demo_b<T>::getValue() const 前面新增關鍵字typename加以宣告,告訴編譯器demo_b<T>::VALUE是一個型別。
template<typename T>
typename demo_b<T>::VALUE demo_b<T>::getValue() const
{
std::cout << "demo_b::getValue()" << std::endl;
return value;
}