2015-03-17 4 views
0

Сначала я реализовал следующие функции в том же файле .cpp, что и main(). Все работает отлично. Но я столкнулся с некоторой проблемой, когда попытался определить их в файле заголовка и реализовать их в отдельном файле .cpp.Функция шаблона LNK2005

Это мой исходный код:

template <class T> //implement the sum function of one single container 
double sum(const T& source){...} 

//explicit specialization for map 
template<> 
double sum<map<string, double>>(const map<string,double>& source){...} 

template <class T> //implement the sum function for two iterators 
double sum(const class T::const_iterator& start, const class T::const_iterator& end){...} 

//explicit specialization for map (sum function of iterator) 
template<> 
double sum<map<string, double>>(const map<string, double>::const_iterator& start,const map<string, double>::const_iterator& end){...} 

void main(){...} 

Затем я удаляю выполнение функций и определить их в файле заголовка:

template <class T> //implement the sum function of one single container 
double sum(const T& source); 

//explicit specialization for map 
template<> 
double sum<map<string, double>>(const map<string,double>& source); 

template <class T> //implement the sum function for two iterators 
double sum(const class T::const_iterator& start, const class T::const_iterator& end); 

//explicit specialization for map (sum function of iterator) 
template<> 
double sum<map<string, double>>(const map<string, double>::const_iterator& start,const map<string, double>::const_iterator& end); 

и реализовать их в файле .cpp.

Тогда, когда я включаю оба файла заголовочного файла и CPP, и запустить проект:

main(){...} 

Я получил сообщение об ошибке, как:

sum.obj : error LNK2005: "double __cdecl sum<class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >.... 

Может кто-нибудь дать подсказку, что я мог бы что сделали?

Большое спасибо!

+0

Посмотрите там ===> в правой части этой страницы в разделе Связанный товар. «Почему шаблоны могут быть реализованы только в файле заголовка?» рассказывает вам все, что вам нужно знать. –

ответ

0

Я думаю, что это ваша проблема:

double sum<map<string, double>> # <-- here 

Кажется, что вы используете оператор «>>», вы должны дать место для этого избежать

double sum< map<string, double> > # space 
+0

Нет, это разрешено делать с C++ 11. – Fireho

+0

Я не видел тег C++ 11 – Joel

+1

На самом деле, я думаю, что тег C++ 11 создан для особых проблем с C++ 11, а не с C++ вообще. Также это ошибка компоновщика, а не ошибка компилятора - если бы это была проблема с >> интерпретируемой как оператор смены битов, это было бы ошибкой компилятора. – Fireho

Смежные вопросы