關於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,不會出錯。
以上程式碼就是錯誤的,typedef在類外,首先執行該typedef語句,T未知型別,故而出錯。主函式也無法給typedef中T確定型別。#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在執行中必須要有確定型別才能轉換,結合編譯原理理解這一點。
相關推薦
關於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關鍵字儘管在語法上是一種儲存型別,但正如其名所示,它用來定義新的型別名稱,而不是定義新的變數或函式”