2013-02-10 2 views
0

Я написал свою программу, и она работает, когда я сохраняю все в файлах заголовков, а затем получаю основное. Я теперь разделяю их на файлы реализации, но Eclipse продолжает давать мне ошибки. Это дает мне ошибку при каждой открывающейся фигуре конструктора и функций. В нем говорится о каждом из них «Переопределение (название конструктора или метода), ранее объявленное здесь». Что я делаю неправильно, потому что он работает в файле заголовка?Реализация против файла заголовка

#include "KeyValuePair.h" 

template<typename Key,typename Value> 
KeyValuePair<Key,Value>::KeyValuePair() 
{ // error here 
} 

template<typename Key,typename Value> 
void KeyValuePair<Key,Value>::setPair(Key key, Value value) 
{ // error here 
    pairKey = key; 
    pairValue = value; 
} 

template<typename Key,typename Value> 
Key KeyValuePair<Key,Value>::getKey() const 
{ // error here 
    return pairKey; 
} 

template<typename Key,typename Value> 
Value KeyValuePair<Key,Value>::getValue() const 
{ // error here 
    return pairValue; 
} 

Заголовочный файл:

#ifndef _KEYVALUEPAIR_H_ 
#define _KEYVALUEPAIR_H_ 

template<typename Key,typename Value> 
class KeyValuePair 
{ 
    private: 
     Key pairKey; 
     Value pairValue; 

    public: 
     KeyValuePair(); 
     void setPair(Key key,Value value); 
     Key getKey() const; 
     Value getValue() const; 
}; 



#include "KeyValuePair.cpp" 
#endif 
+0

Определения шаблонов идут в заголовочных файлах, и вы не делаете «# include» файлы реализации без уважительной причины для этого –

ответ

1

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

См. templates документация.

+0

Весь код для шаблонов * есть * в файле заголовка через '# include' , – Johnsyweb

2

В настоящее время у вашего файла KeyValuePair.h есть #include KeyValuePair.cpp внизу. KeyValuePair.cpp также # включает заголовочный файл. В заголовочном файле есть обычный «защитник» (#ifndef _KEYVALUEPAIR_H_), чтобы предотвратить кратковременное включение, но ваши файлы CPP этого не делают. Поэтому, когда вы пытаетесь скомпилировать CPP-файл, он извлекает файл H, который снова загружает файл CPP. Следовательно, ошибка множественного определения.

Простейшим решением для вас, но не обязательно является наиболее правильным, было бы удалить #include "KeyValuePair.h" линию от верхней части файла KeyValueHeader.cpp.

Я подозреваю, что вы пытаетесь скомпилировать KeyValuePair.cpp в своем Makefile, который вам не нужен (и не должен). Вам просто нужно, чтобы исходные файлы нуждались в вашем классе шаблонов до #include "KeyValuePair.h".

Стандартная практика для шаблонов заключается в том, чтобы сохранить декларацию и реализацию в том же заголовочном файле, что неявно устраняет эти проблемы. Нередко можно увидеть реализации методов класса шаблонов, встроенных в объявление класса шаблонов, и все они содержатся в одном файле заголовка. Уничтожает все, что вы узнали о разделении интерфейса от реализации, но с ним проще работать.

+0

Общим решением является предоставление другого расширения файлам реализации шаблона, например. '.cppt' вместо' .cpp'. Это напоминает вам, почему он включен в заголовок и почему make-файл не делает его автономным. –

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