【发布时间】:2009-05-14 21:03:02
【问题描述】:
我有一个模板类,我用一个指向它的指针对其进行了子类化(装饰器模式)。我添加了一个getBase() 调用来返回指向基类的指针以用于任何进一步的子类。但是,当我使用 getBase() 并仅调用基类方法时,我收到一个链接器错误,它无法在中间(装饰器)类中找到该方法的符号?
像这样:
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:
(.data.rel.ro. --stuff--
[vtable for D<T>]:
undefined reference to
'D<T>::fun( basic_istream<char, char_traits<char> >&)'
但是,我没有调用 D 对fun(istream&) 的定义……它甚至没有!我直接使用指向基类的指针...当我为D<T>::fun(istream&) 添加定义时,一切正常,但我不明白为什么?
【问题讨论】:
-
这段代码包含太多不相关的东西和太多的编译错误(可能是由于将其修剪为这个问题的结果),需要认真考虑。如果您想要一个真正的答案,我建议使用可以真正编译并最小化显示问题的代码来编辑问题。
-
我很抱歉。我必须从记忆中输入所有这些,因为我在工作中没有互联网连接。在我将问题减少到它的本质并且我可以编译它之后,我会再次尝试它。那我再发吧。