【问题标题】:Netbeans on Ubuntu; C++; Defined template "undefined"Ubuntu 上的 Netbeans; C++;定义的模板“未定义”
【发布时间】:2012-02-19 04:48:20
【问题描述】:

我正在 Ubuntu 11.04 上的 Netbeans 7.1 上开发 C++。我想知道是否有人可以告诉我为什么 Stack fs(5);被视为对 `Stack::Stack(int)' 的未定义引用。为什么它不被视为一个带有用于 T 的 float 的类?

#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;
}

谢谢, 彼得。

【问题讨论】:

  • 一百万零一个重复......你真的不得不说using namespace std; 两次,只是为了表明你有多不在乎这是一个可怕的,可怕的话?
  • @KerrekSB,只要您不将using namespace std 放在您的库头文件中(从而将其强加于其他人),使用它就没有问题。

标签: c++ templates ubuntu-11.04 netbeans-7.1


【解决方案1】:

我在任何地方都没有看到Stack&lt;float&gt;::Stack(int) 的实际代码。你已经声明了它,但没有定义。所以它实际上并不存在(即使你说它存在;编译器通常只是相信你的话),并且链接器将无法找到它,即使它走得那么远。

您需要以类似于定义~Stack() 的方式定义函数,或者在代码中的其他位置以与任何其他成员函数相同的方式定义该函数。

【讨论】:

  • 这就是问题所在。谢谢。
【解决方案2】:

要使用类模板,你必须定义它们,仅声明是不够的。编译器所做的是什么时候找到类模板的真正用法,比如Stack&lt;int&gt;,它会将 int 替换为类模板定义中的 T 并为它生成一个类。当它看到Stack&lt;double&gt; 时,它会根据您的类模板生成另一种类型,这些生成的类型称为模板类。

顺便说一句,我如何使用 c++ 语法(ignore ") int 回复,它就消失了。

【讨论】:

  • 要将 之类的内容放入回复中,请将其包含在反引号中。除了使其可见之外,它还将其格式化为代码。如果没有反引号,您的文本将被解释为 HTML,并且大多数浏览器不会显示它。我已经编辑了你的答案来说明。
猜你喜欢
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多