我正在Ubuntu 11.04上的Netbeans 7.1上开发C++。我想知道是否有人能告诉我为什么Stack fs(5);被视为对"Stack::Stack(int)"的未定义引用。为什么它不被看作是一个用float表示T的类?
#include <iostream>
using namespace std ;
template <class T>
class Stack
{
public:
Stack(int = 10) ;
~Stack() { delete [] stackPtr ; }
int method1(const T&);
int method2(T&) ;
int method3()const { return top == -1 ; }
int method4() const { return top == size - 1 ; }
private:
int attribute1 ;
int attribute2 ;
T* stackPtr ;
} ;
using namespace std;
int main()
{
// This line gives the error message "undefined reference to `Stack<float>::Stack(int)'"
Stack<float> fs(5);
return 0;
}
谢谢,彼得。
我在任何地方都看不到Stack<float>::Stack(int)
的实际代码。你已经声明了,但没有定义。因此,它实际上并不存在(尽管你说它存在;编译器通常只是相信你的话),而且链接器将无法找到它,如果它走得那么远的话。
您需要像定义~Stack()
一样定义函数,或者像定义任何其他成员函数一样在代码的其他地方使用它。
要使用类模板,必须定义它们,只有声明是不够的。编译器所做的是,当你找到类模板的真实用法时,比如Stack<int>
,它会在类模板定义中放入int来替换T,并为它生成一个类。当它看到Stack<double>
时,它会基于你的类模板生成另一个类型,这些生成的类型称为模板类。
顺便问一下,我该如何使用c++语法<"int">(忽略")int回复,它就消失了。