NetBeans в Ubuntu;C ++;Определенный шаблон "неопределенный" - PullRequest
0 голосов
/ 19 февраля 2012

Я занимаюсь разработкой C ++ на Netbeans 7.1 на Ubuntu 11.04. Мне было интересно, если кто-нибудь может сказать мне, почему Stack fs (5); рассматривается как неопределенная ссылка на `Stack :: Stack (int) '. Почему он не рассматривается как класс с плавающей точкой, используемой для 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;
}

Спасибо, Питер.

Ответы [ 2 ]

2 голосов
/ 19 февраля 2012

Я нигде не вижу фактического кода для Stack<float>::Stack(int). Вы объявили это, но нет определения. Таким образом, он на самом деле не существует (даже если вы говорите, что он есть; компилятор часто просто берет ваше слово за него), и компоновщик не сможет его найти, даже если он зайдет так далеко.

Вам нужно либо определить функцию аналогично тому, как вы определили ~Stack(), либо использовать ее в другом месте кода так же, как и у любой другой функции-члена.

0 голосов
/ 19 февраля 2012

Чтобы использовать шаблон класса, вы должны определить его, только объявления недостаточно.То, что делает компилятор, когда находит реальное использование шаблона класса, скажем Stack<int>, он помещает int для замены T в вашем определении шаблона класса и генерирует класс для него.Когда он видит Stack<double>, он генерирует другую базу типов на вашем шаблоне класса, эти сгенерированные типы называются шаблоном класса.

Кстати, как я могу использовать грамматику c ++ <"int"> (игнорировать ") в ответе, он просто исчезает.

...