LINUX.ORG.RU

C++ template linker error

 , ,


0

1

Не могу заставить собраться приметивнейшую прогу с использованием шаблонного класса. Может наш лор сможет помочь? Ошибка следующая:
ld: symbol(s) not found for architecture x86_64

stack.h:

#ifndef STACK_H
#define STACK_H

using namespace std;
const int MAX = 100;

template <class Type> class Stack
{
private:
    Type st[MAX];
    int top;
public:
    Stack();
    void push(Type var);
    Type pop();
};

#endif // STACK_H

stack.cpp

template <class Type> Stack<Type>::Stack()
{
    top = -1;
}

template <class Type>void Stack<Type>::push(Type var)
{
    st[++top] = var;
}

template <class Type> Type Stack<Type>::pop()
{
    return st[top--];
}

void TemporaryFunction ()
{
    Stack<int> s;
}
main.cpp:

#include "stack.h"

int main(int argc, char *argv[])
{
    Stack<float> s1;
    return 0;
}

Шаблоны должны быть полностью опеределены в заголовочном файле. Если более подробно, то шаблон сам по себе не генерирует бинарного кода чтобы он мог содержаться в .o файле и подключаться линкером. Он генерирует бинарный код в месте его инстанциирования.

vertexua ★★★★☆ ()
Ответ на: комментарий от ECLIPSE

Да, можно прямо в классе писать тело методов, не разделяя их так как у тебя.

Это ограничения языка С++, возможно будет решено в следующих версиях языка, когда в него добавят модули. Пока не готово

http://clang.llvm.org/docs/Modules.html

vertexua ★★★★☆ ()
Ответ на: комментарий от vertexua

А добавление модулей комитет уже утвердил как плануруемую к добавлению фичу, или они пока что лишь фантазиями делятся друг с другом? Как показывает практика, они могут запросто выкинуть что-то прямо перед принянием стандарта и придется ждать еще 10 лет.

m0rph ★★★★★ ()
Последнее исправление: m0rph (всего исправлений: 1)
Ответ на: комментарий от vertexua

Если более подробно, то шаблон сам по себе не генерирует бинарного кода чтобы он мог содержаться в .o файле и подключаться линкером

Это не так, man явное инстанцирование

annulen ★★★★★ ()
Ответ на: комментарий от annulen

Это так, т.к. явное инстанцирование - это уже не шаблон сам по себе, а явный запрос генерации нужного тебе конкретного инстанса.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.