關於c++中的類模板,常見的形式為:
templateclass classname;比如筆者在這裡舉乙個例子:
#include #include#include templateclass stack從上面的**可以看出,為了定義成員函式,我們使用了下面的形式,比如:};templatevoid stack::push(t const& a)
templatevoid stack::pop()
return elems.pop_back();
}templatet stack::top()const
return elems.back();
}int main()
templatevoid stack::push(t const& a)本來在此處有乙個問題的,也就是關於類成員函式的實現位置的問題,這個問題我們稍後會提到。
現在我們為了測試上面的例子可以使用下面的函式**:
int main();對於特化類模板而言,就如同編寫普通的類成員函式一樣,比如:
void mystack::pop(int const& a)下面我們呢來看看類模板的區域性特化。
例如對於下面的**:
templateclass myclass;而言,以下幾種像是的區域性特化都是正確 的:
//區域性特化 兩個引數一致在下面的例子中:templateclass myclass;
//區域性特化 第二個為int
templateclass myclass;
//兩個引數都為指標型別
templateclass myclass;
myclassmif; //將使用myclassmif; //將使用myclassmif; //將使用myclassmp; //將使用大家要注意下面的錯誤**,
myclassm;z這兩個**在上面的這個例子中都是錯誤的。前者因為會和myclass產生二義性。後者會和myclass產生二義性、使得編譯器不知道應該匹配哪乙個。myclassm;
如果想解決上面的第二個二義性的話,我們可以專門特化下面的**:
templateclass myclass;接下來我們來看看預設模板引數:
我們先來看看**再說,大家注意和上面的例子進行比較:
#include #include#include #include #include template>來宣告了乙個double stack,他的內部使用的是std:class stack
};templatevoid stack::push(t const& a)
templatevoid stack::pop()
return elems.pop_back();
}templatet stack::top()const
return elems.back();
}int main(){
try{
stackintstack;
stack> doustack;
//注意,這裡千萬不能寫下面的這一行**:
// stack> doustack;
intstack.push(1);
std::cout<
我們使用
stack> doustack;
C template學習總結6
對於基本型別來說,並沒有乙個default模式來講他們初始化為有意義的值,沒有初始化的變數,其指都是未定義的,但是在模板這一塊呢?我們可以採用下面的形式 template void foo 對於class template我們可以採用下面例子的方式 template class myclass 通過...
c template學習總結3
和往常一樣,先來看一段 include template class stack bool full const constructor template stack stack numelems 0 start with no elements template void stack push t...
c template 5 x 學習總結
1.雙重模版引數,即模版的引數也是模版,不過只能用於類模版,函式模版中不能這麼使用 例如 template class cont std deque stack8 這裡注意首先 class cont不能寫typename cont 這個比較好理解,這是個類模版。其次給cont設定預設值 std de...