Ваша проблема с файлами в том виде, в каком они есть сейчас, заключается в том, что когда вы пытаетесь скомпилировать B.cpp, тогда это:
#include "B.h"
template <class T>
T B<T>::getVal(){
return val;
}
и это:
#ifndef BBBB
#define BBBB
template <class T>
class B{
public:
T val;
T getVal();
};
#include "B.cpp"
#endif
объединяется в следующее:
#ifndef BBBB
#define BBBB
template <class T>
class B{
public:
T val;
T getVal();
};
#ifndef BBBB // <- BBBB has been defined at this point, so everything between this and the #endif is skipped
#endif
template <class T>
T B<T>::getVal(){
return val;
}
#endif
template <class T>
T B<T>::getVal(){
return val;
}
На данный момент я надеюсь, что очевидно, почему вы получаете ошибку: B.cpp:4:3: error: redefinition of ‘T B::getVal()’ T B::getVal(){
.
Правильное исправление - просто поместить всю реализацию шаблонав шапке и избавьтесь от файла .cpp
. Но если это не вариант из-за испорченного автомаркера, попробуйте добавить include-guards в файл .cpp
. Но имейте в виду, что это плохая практика повсюду (.cpp
файлы никогда не должны быть #include
'ed и, следовательно, никогда не должны включать include-guard), поэтому, если кто-то увидит ваш код, тогда будьте готовы ко многим вопросам иподнятые брови.
НО! Вероятно, первым шагом должно быть попытка поговорить с тем, кто дал вам задание, потому что здесь что-то не так;либо с помощью автоматического маркера, либо с вашим пониманием того, как это работает. Шаблонный класс должен , а не иметь .cpp
файл (или он должен быть пустым).