У меня есть шаблонный класс, который я разделил с указателем на него (шаблон Decorator). Я добавил getBase()
вызов, чтобы вернуть указатель на базовый класс для любых дальнейших подклассов. Однако, когда я использую этот getBase()
и вызываю метод только базовых классов, я получаю ошибку компоновщика, что он не может найти символ для этого метода в промежуточном (Decorator) классе?
Как это:
template <typename T> class B {
public:
typedef std::auto_ptr<T> MYFUN(
std::istream&, const std::string&, const std::string& );
public:
B<T>( MYFUN* p );
auto_ptr<T> fun( istream& );
private:
MYFUN *fptr;
};
template <typename T>
class D : public class B<T>
{
D( typename B<T>::MYFUN *fPtr, B<T> *providedBase );
//Looks like B
B* getBase() { return base_ ; }
private:
B* base_;
};
template <typename T>
class Dagain : public class D<T>
{
//Looks like D
auto_ptr<T> fun( istream& );
};
auto_ptr<T>
Dagain::fun( istream& is )
{
this->getBase()->fun( is );
}
Обратите внимание, что в D<T>
нет определения для fun( istream& )
. Цель состоит в том, чтобы клиент использовал указатель на базу для вызова B<T>::fun( istream& )
Когда клиент создает объект Dagain
, компоновщик говорит (в основном):
Client.o:<br>
(.data.rel.ro. --stuff--<br>
[vtable for D<T>]:<br>
undefined reference to<br>
'D<T>::fun( basic_istream<char, char_traits<char> >&)'
Но я не называю D определением fun(istream&)
... его даже нет! Я использую указатель непосредственно на базовый класс ... Когда я добавляю определение для D<T>::fun(istream&)
, все работает, но я не понимаю, почему?