Ubuntu 上的 Netbeans;C++;定义的模板"undefined"

Netbeans on Ubuntu; C++; Defined template "undefined"

本文关键字:undefined 定义 上的 Netbeans C++ Ubuntu      更新时间:2023-10-16

我正在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回复,它就消失了。

相关文章: