Я пытаюсь создать класс C ++ с шаблонным суперклассом. Идея в том, что я могу легко создать множество похожих подклассов из нескольких суперклассов, которые имеют схожие характеристики.
Я выполнил проблемный код следующим образом:
template_test.h
:
template<class BaseClass>
class Templated : public BaseClass
{
public:
Templated(int a);
virtual int Foo();
};
class Base
{
protected:
Base(int a);
public:
virtual int Foo() = 0;
protected:
int b;
};
template_test.cpp
:
#include "template_test.h"
Base::Base(int a)
: b(a+1)
{
}
template<class BaseClass>
Templated<BaseClass>::Templated(int a)
: BaseClass(a)
{
}
template<class BaseClass>
int Templated<BaseClass>::Foo()
{
return this->b;
}
main.cpp
:
#include "template_test.h"
int main()
{
Templated<Base> test(1);
return test.Foo();
}
Когда я строю код, я получаю ошибки компоновщика, говоря, что символы Templated<Base>::Templated(int)
и Templated<Base>::Foo()
не могут быть найдены.
Быстрый Google предлагает, что добавление следующего к main.cpp
решит проблему:
template<> Templated<Base>::Templated(int a);
template<> int Templated<Base>::Foo();
Но это не решает проблему. Добавление строк в main.cpp
также не работает. (Хотя, что интересно, добавление их к обоим приводит к ошибкам «кратно определенного символа» от компоновщика, поэтому они должны что-то делать ...)
Однако, , размещение всего кода в одном исходном файле решает проблему. Хотя это было бы неплохо для вышеприведенного примера, реальное приложение, на которое я смотрю, стало бы неуправляемым очень быстро, если бы мне пришлось поместить весь лот в один файл cpp.
Кто-нибудь знает, возможно ли то, что я делаю? (Как) я могу решить свои ошибки компоновщика?
Я бы предположил, что мог бы встроить все методы в class Templated
, и это сработало бы, но это тоже не кажется идеальным.