2013-08-28 3 views
1

Я получаю ошибку компоновщика (2001, неразрешенный внешний символ) со следующим кодом. Это происходит только с шаблонами, я могу совершенно сделать то же самое с пустотой, междунар и т.д.Шаблон C++ в файле заголовка

//a.h 

template<typename T> T foo(DWORD); 



//a.cpp 

#include "a.h" 

template<typename T> T foo(DWORD bar) 
{ 
    return T(); 
} 



//main.cpp 

#include "a.h" 

void something() 
{ 
    int hello = foo<int>(1); 
} 

Это делает работу, когда я положил декларацию обув в файле заголовка, как этот

//a.h 

template<typename T> T foo(DWORD bar) 
{ 
    return T(); 
} 
+4

Вы должны прочитать о [почему могут быть реализованы шаблоны только в заголовочном файле] [1] [1]: http://stackoverflow.com/questions/495021/why-can -templates только предстоит осуществить-в-заголовок-файл – piotrekg2

ответ

0

Компилятор C++ должен видеть определение шаблона для выполнения неявного экземпляра. Это означает, что компилятор C++ может генерировать объектный код для вызова функции шаблона автоматически, если он знает реализацию в момент ее вызова.

Вы можете, однако, полагаться на явное инстанцирование. Это означает, что вы попросите компилятор сгенерировать код C++ для конкретного экземпляра указанного вами шаблона. Затем компилятор C++ в течение времени ссылки сможет найти эту реализацию (через внешнюю связь), когда шаблон используется в main.cpp.

//a.cpp 

#include "a.h" 

template<typename T> T foo(DWORD bar) 
{ 
    return T(); 
} 

template int foo<int> (DWORD); // explicit instantiation 
Смежные вопросы