1. 程式人生 > 其它 >C++類中typedef關鍵字的使用

C++類中typedef關鍵字的使用

技術標籤:嵌入式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;
}