2011-04-01 162 views
4

我也看了一些相關的線程,但仍是問題不明確:模板類專業化

#include <stdio.h> 
#include <vector> 
#include <iostream> 

template <> class stack <int> 
{ 
    public: 
    std :: vector <int> stackVector; 

}; 

的編譯錯誤:

templateSpecializ.cpp:5: error: ‘stack’ is not a template 
templateSpecializ.cpp:6: error: explicit specialization of non-template ‘stack’ 

從這個鏈接:coderSource.net

有無我錯過了一些觀點?我覺得我有。我甚至試圖在那裏定義函數,但這沒有幫助。

+0

爲什麼有額外的你的代碼中的任何地方都有空格(例如std :: vector)?如果這是有意的,它將不起作用,將其刪除。 – Darhuuk 2011-04-01 08:41:46

+0

感謝您的困擾,代碼與這些空間一起工作,它們有目的地存在,我開發了一個插入空格的習慣,只是爲了使代碼看起來乾淨整潔,並且使用這些空格進行編譯。 – 2011-04-01 08:52:10

+0

哦,好吧,對不起,我從來沒有見過這樣的代碼,並認爲它不會工作。 – Darhuuk 2011-04-01 09:03:28

回答

7

這是模板稱爲堆棧模板專業化。堆棧沒有在任何這些頭文件中定義。如果您希望定義一個新的模板類,你必須首先定義基本情況

template<typename T> 
class stack 
{ 
    //implementation goes here 
}; 

template<> 
class stack<int> 
{ 
public: 
    std::vector<int> stackVector; 
}; 

如果你希望只定義堆棧int而不是爲每個類型你可以使用

template<typename T> class stack; 
template<> 
class stack<int> 
{ 
public: 
    std::vector<int> stackVector; 
}; 
+0

感謝你們,現在我明白了,在定義基類之後,我可以寫出許多類型的派生類,第二個例子更加清晰 – 2011-04-01 08:55:48

+1

所有這些雖然我曾經相信LinuxQuestions.org是唯一有用的網站:rolleyes: – 2011-04-01 08:56:32

+0

你說過「/ /實現在這裏」對於你所展示的堆棧類的定義。我可以在那裏聲明一個向量,然後在底部特化?e中定義它。g:'template class stack { public: \t std :: vector stackVector; }; template <> class stack { public: void push(int x); int pop(); }; void stack :: push(int obj) { stackVector.push_back(obj); }' – 2011-04-01 10:16:37

2

如果您還沒有專門的模板,則無法專門化您的模板。所以這應該工作:

template <typename T> 
class stack 
{ 
}; 

template <> 
class stack<int> 
{ 
    public: 
    std::vector<int> stackVector; 
}; 
+0

我很感激你,該鏈接沒有說任何這樣的事情,或者我錯過了,無論如何,謝謝你的提示 – 2011-04-01 08:43:47