0

这是一个涉及继承、模板类和函数指针的问题。我正在开发一个模块化工具,这里是它的最小描述。

我有一个通用基类,我需要尽可能通用(原因未在此处说明):

// base class
class Base {
public:
    virtual void assess( ) = 0;
};

然后我有一个更专业的派生类,我将其定义为模板:

// derived template class
template <typename T>
class Derived : public Base
{
protected:
    T mValue;
public:
    void assess( );
    T value( ) { return mValue; }
};

// function specialization here
template<>
inline void Derived<int>::assess( )
{
    mValue = 3;
}

有些部分是专门的,如assess()函数,如上所示。

然后我有一个额外的继承层。主要思想是有一个通用assess()函数,该函数涉及一个以Base对象为参数的函数指针。

// class specialization for special evaluation through function pointers
template <typename T>
class DerivedFuncPtr : public Derived<T> {
protected:
    T (*mFuncPtr)( Base& );
    Base *mFuncVar;
public:
    DerivedFuncPtr<T>( T (*f)(Base&), Base& variable )
    {
        mFuncPtr = f;
        mFuncVar = variable;
    }
    void assess( )
    {
        mFuncVar->assess();
        this->mValue = (*mFuncPtr)(*mFuncVar);
    }
};

好的,问题是如何使用它。主要来源如下所示:

int squared( Derived<int>& );
int squared( Derived<int>& d )
{
    int val = d.value();
    return val*val;
}

int main (int argc, const char * argv[])
{
    Derived<int> object;
    object.assess();
    cout << object.value() << "\n" ;

    DerivedFuncPtr<int> objectFP( squared, object ); // (*)

    return 0;
}

在线编译时出现错误(*)

Candidate constructor not viable: no known conversion from 'int (Derived<int> &)' to 'int (*)(Base &)' for 1st argument

我是否会被迫将函数指针封装到模板U (*)(Base&)类中,还是我在这里遗漏了一些明显的东西?

为了美观,并且因为我真的不熟悉最近的 C++ 演变,我宁愿不使用boost库或 C++11,但是,如果不能帮助...谢谢。

4

1 回答 1

0
DerivedFuncPtr<T>( T (*f)(Base&), Base& variable )

构造函数的第一个参数是指向以 aBase&作为参数(并返回 a T)的函数的指针。Base&函数指针的参数与 的参数不匹配,squared后者采用Derived<int>&.

解决此问题的一种方法是制作DerivedFuncPtr一个带有两个模板参数的类模板,一个是typename T您已经拥有的,另一个是其他类型名,它将替换Base您的数据成员和构造函数中的使用。

mFuncVar = variable;顺便说一句,您还会在该构造函数中遇到错误。mFuncVar是指针,variable是引用。

于 2012-10-26T04:28:31.220 回答