1. 程式人生 > >關於c++中型別定義typedef和類模板能否共用問題

關於c++中型別定義typedef和類模板能否共用問題

#include <iostream>
#include <deque>
using namespace std;
template <class T>

class A
{
	typedef deque<T> cont;
protected:
	cont c;
public:
	void push(T&t)
	{
		c.push_back(t);
	}
	void display()
	{
		for (int i = 0; i < c.size(); i++)
		{
			cout << c.at(i) << "\t";
		}
	}
};
int main()
{
	A<int> a;
	for (int i = 0; i <= 5; i++)
		a.push(i);
	a.display();
	return 0
}
以上程式碼是正確的。原因就在於typedef定義型別轉變的時候必須是確定的型別,這裡程式執行時首先進行主程式中A<int>a,即這裡確定了模板引數T為int,然後程式轉至上面類

中順序執行該類,(這裡可以把類作為一個函式呼叫來看)當執行到typedef語句時,T型別已經確定為int,不會出錯。

#include <iostream>
#include <deque>
using namespace std;
template <class T>
typedef deque<T> cont;
class A
{
	
protected:
	cont c;
public:
	void push(T&t)
	{
		c.push_back(t);
	}
	void display()
	{
		for (int i = 0; i < c.size(); i++)
		{
			cout << c.at(i) << "\t";
		}
	}
};
int main()
{
	A<int> a;
	for (int i = 0; i <= 5; i++)
		a.push(i);
	a.display();
	return 0;

}
以上程式碼就是錯誤的,typedef在類外,首先執行該typedef語句,T未知型別,故而出錯。主函式也無法給typedef中T確定型別。

typedef在執行中必須要有確定型別才能轉換,結合編譯原理理解這一點。

相關推薦

關於c++型別定義typedef模板能否共用問題

#include <iostream> #include <deque> using namespace std; template <class T> class A { typedef deque<T> cont; p

淺析C#的結構體 筆記

類和結構是 .NET Framework 中的常規型別系統的兩種基本構造。 兩者在本質上都屬於資料結構。封裝著一組總體作為一個邏輯單位的資料和行為。 資料和行為是該類或結構的“成員”,它們包括各自的方法、屬性和事件等 對於C/C++程式設計師來說。結構體和類的差別非常小。僅僅是結構體的預設成員變

C++-如何跟蹤函式

下面是程式的輸出: 用這種方法我們可以通過log可以很清楚的看到程式執行到函式foo了,也就是通過程式的輸出“hello”和“Goodbye”知道程式執行到foo這個函數了。換句話說我們通過 在函式中插入了一個Trace類物件來知道該函式什麼時候被呼叫的。 但是我們的程式肯定不止一個函式,如果我們需要對

c++的函式指標成員函式指標

// // main.cpp // Demo // // Created by 杜國超 on 16/12/28. // Copyright © 2016年 杜國超. All rights reserved. // #include using namespace std; class MYCla

淺析C#的結構體

類和結構是 .NET Framework 中的常規型別系統的兩種基本構造。 兩者在本質上都屬於資料結構,封裝著一組整體作為一個邏輯單位的資料和行為。 資料和行為是該類或結構的“成員”,它們包含各自的方法、屬性和事件等 對於C/C++程式猿來說,結構體和類的區別

為什麽 c++函數模板模板的 聲明與定義需要放到一起?

color code 我們 ack 二進制 通過 如果 之前 類型 將模板的聲明與定義寫在一起實在很不優雅。嘗試用“傳統”方法,及在.h文件裏聲明,在.cpp文件裏定義, 然後在main函數裏包含.h頭文件,這樣會報鏈接錯誤。why!!!!!!!!!!!!! 這是因為函數模

C#定義控制元件隱藏基成員(屬性、方法事件)的方法

       編寫自定義控制元件時,總是繼承C#中提供的Control類,而Control類是C#中所有窗體控制元件的基類,裡面定義了大量的屬性、方法和事件,而很多基類成員在自定義控制元件中可能不需要,因為編寫者會希望在自定義控制元件中隱藏這些成員,避免使用者呼叫這些成員。

C++復雜聲明定義的辨析

返回值 float 就是 str 兩個 順序 常量指針 例子 關鍵字 0x00 前言 c++中的復雜聲明往往令人無法下手,經常使人搞錯這到底聲明的是一個指針還是指針函數。但其實c++對於復雜聲明是遵循一定的規則的,叫做變量名—>右--左-右規則。 0x01 規則解

C++的long long int64型別(轉載)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++字面值常量字面值型別

作者:zhaojia92  來源:CSDN  原文:https://blog.csdn.net/zhaojia92/article/details/50831436  版權宣告:本文為博主原創文章,轉載請附上博文連結!      

C++ 函式模板模板--泛型程式設計

所謂函式模板,實際上是建立一個通用函式,其函式型別和形參型別不具體指定,用一個虛擬的型別來代表。這個通用函式就稱為函式模板。 凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。 一 函式模板初識 1) 為什麼要有函式模板? 函式業務邏輯一樣,但

模板的成員函式在模板定義要注意的地方

1、在宣告類前要有類模板的宣告 2、每個成員函式在模板外定義的時候前面都要有類模板的宣告,注意是每個。 #include<iostream> using namespace std; template<class numtype> //類模板宣

函式模板模板C++)

所謂函式模板,實際上是建立一個通用函式,其函式型別和形參型別不具體指定,用一個虛擬的型別來代表。這個通用函式就稱為函式模板。 函式模板和普通函式的區別: 函式模板不允許自動型別轉化,普通函式能夠進行自動型別轉換 函式模板和普通函式在一起呼叫的規則: 1 函式模板

北京大學MOOC C++學習筆記(七)函式模板模板

函式模板: 交換兩個整型變數的值的Swap函式: void Swap(int & x,int & y) {     int tmp = x;     x = y;     y = tmp; } 交換兩個double型變數的值的Swap函式: void Swa

C#使用typeof關鍵字GetType()獲取的內部結構(反射機制)

一、問題描述 java有反射機制,C#也有反射機制,在C#中typeof關鍵字用於獲取型別的System.Type物件,該物件的GetMethods()方法可以得到型別中定義的方法物件的計集合,呼叫方法集合中每個方法物件的GetParameters()可以得到每個方法的引數

C++定義型別列舉型別

不限定作用域列舉型別說明: 列舉元素是常量,不能對它們賦值 例如有如下定義enum Weekday {SUN, MON, TUE, WED, THU, FRI, SAT}; 不能寫賦值表示式:SU

C的自殺函式C++的自殺

今天看glibc 2.7的記憶體分配程式碼,注意到一個詭異現象:某函式的指標自我清空。也就是說,此函式指標只能用一次。具體說來就是指向函式malloc_hook_ini的函式指標__malloc_hook。於是自己嘗試了一下這類函式的寫法。 // Function-Suic

C++的long long__int64型別

                      C語言中long long的用法   在C語言的C99標準擴充套件了新的整數型別 long long,long是32位寬,佔4個位元組,long long通常被定義成 64 位寬,也就可以實現了在32位機器上可以擴充套件8位元

C++class定義的簡單應用

#include<iostream> using namespace std; class stu{ /*定義類 */ protected: /*保護 ,不能被類外成員訪問 */ int high; int weight; private: /

《你的月亮我的C》(一):型別定義(typedef)

    “typedef關鍵字儘管在語法上是一種儲存型別,但正如其名所示,它用來定義新的型別名稱,而不是定義新的變數或函式”