Затмение неопределенной ссылки - PullRequest
1 голос
/ 25 июня 2011

Я использую Eclipse и MinGW. У меня ошибка undefined reference to для всего, что я пишу в h-файлах, которые я включаю в cpp-файл, где находится основной файл. Я создаю пустой проект, и снова то же самое (

main.cpp

#include <iostream>
#include "Stack.h"

using namespace std;

int main(){
    Stack<int> stack(10);
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    return 0;
}

stack.h

#ifndef STACK_H_
#define STACK_H_

template <class T>
class Stack{
private:
    struct StackEl;
    StackEl *top;
public:
    Stack();
    Stack(T el);
    ~Stack();
    void Push(const T& el);
    T Pop();
};

#endif /* STACK_H_ */

и stack.cpp дополняют все из stack.h Если я включаю не h-файл, а cpp - все работает. Помогите, пожалуйста!

У меня есть следующие ошибки

D:/Workspacee/Stack2/Debug/../src/Stack2.cpp:16: undefined reference to `Stack<int>::Stack(int)'
D:/Workspacee/Stack2/Debug/../src/Stack2.cpp:18: undefined reference to `Stack<int>::~Stack()'
D:/Workspacee/Stack2/Debug/../src/Stack2.cpp:18: undefined reference to `Stack<int>::~Stack()'

Ответы [ 2 ]

1 голос
/ 26 июня 2011

Это ошибка компоновщика. Я не эксперт по Eclipse, но вы должны как-то сказать, чтобы добавить Stack.o к команде связывания.
Если вы включите Stack.cpp вместо Stack.h, реализации из cpp-файла будут включены препроцессором в main.cpp перед компиляцией, поэтому на этапе компоновки не будет неразрешенных ссылок на внешние функции.

0 голосов
/ 26 июля 2011

Мой плохой, это потому что шаблоны! Когда вы используете шаблон, весь код, включая реализацию функций, должен находиться в заголовочном файле, или вы должны писать прототипы для каждого типа, с которым собираетесь использовать свои функции-шаблоны. Я забыл, что работа с шаблонами не такая, как с обычной функцией: (* ​​1001 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...