2011-04-01 157 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