gpt4 book ai didi

c++ - 不能调用基类方法,即使我有一个指向它的指针(装饰器)?

转载 作者:行者123 更新时间:2023-11-28 08:33:14 25 4
gpt4 key购买 nike

我有一个模板类,我用指向它的指针对其进行了子类化(装饰器模式)。我添加了一个 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 );
}

注意 fun( istream& ) 没有定义在 D<T> .目的是让客户端使用指向基的指针来调用 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> >&)'

但是,我不是调用 Dfun(istream&) 定义……一个都没有!我直接使用指向基类的指针...当我为 D<T>::fun(istream&) 添加定义时一切正常,但我不明白为什么?

最佳答案

您忘记在模板定义中指定模板参数。此外,您还有更多错误。这是工作代码:

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 B<T>
{
D( typename B<T>::MYFUN *fPtr, B<T> *providedBase );
//Looks like B
B<T>* getBase() { return base_ ; }
private:
B<T>* base_;
};

template <typename T>
class Dagain : public D<T>
{
//Looks like D
auto_ptr<T> fun( istream& );
};

template <typename T>
auto_ptr<T>
Dagain<T>::fun( istream& is )
{
this->getBase()->fun( is );
}

关于c++ - 不能调用基类方法,即使我有一个指向它的指针(装饰器)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/865756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com