template
От: nomer10  
Дата: 12.05.10 09:09
Оценка: -2
Возникла проблема с использованием шаблонов класса.


// testtemplate.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include "cab.h"

int _tmain(int argc, _TCHAR* argv[])
{
    Cab<char> q;
    std::cout << q.get(100);
    return 0;
}



// Cab.h
#pragma once

template <class T> 
class Cab
{
public:    
    Cab(void);
    int get(T data);
private:
    int val;
};



// Cab.c
#include "Cab.h"

template <class T> Cab<T>::Cab()
{
    val = 10;
}

template <class T> int Cab<T>::get(T data)
{
    return data * val;
}


В процессе линковки выдает ошибки
error LNK2001: unresolved external symbol "public: int __thiscall Cab<char>::get(char)" (?get@?$Cab@D@@QAEHD@Z)    testtemplate.obj    testtemplate
error LNK2001: unresolved external symbol "public: __thiscall Cab<char>::Cab<char>(void)" (??0?$Cab@D@@QAE@XZ)    testtemplate.obj    testtemplate



Среда VS 2008

Если объявление класса и реализацию поместить в файл testtemplate.cpp (main) ошибки нет.
Re: template
От: Анатолий Широков СССР  
Дата: 12.05.10 09:15
Оценка:
N>Если объявление класса и реализацию поместить в файл testtemplate.cpp (main) ошибки нет.

Как ты думаешь, почему? Правильно, template это продвинутый макрос, не может его определение быть недоступным в точке инстанцирования.
Re: template
От: Bell Россия  
Дата: 12.05.10 09:23
Оценка:
Здравствуйте, nomer10, Вы писали:

N>Если объявление класса и реализацию поместить в файл testtemplate.cpp (main) ошибки нет.


Один из наиболее часто задаваемых вопросов
Короткий ответ — все должно лежать в заголовке.
Подробный ответ можно найти, воспользовавшись поиском.
Любите книгу — источник знаний (с) М.Горький
Re: template
От: uzhas Ниоткуда  
Дата: 12.05.10 09:53
Оценка:
Здравствуйте, nomer10, Вы писали:

N>Возникла проблема с использованием шаблонов класса.

тут обсуждается аналогичный вопрос
http://rsdn.ru/forum/cpp/3803495.flat.aspx
Автор: buka123
Дата: 12.05.10


краткий ответ уже дали: определяй шаблоны в .h, а не в .cpp
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.