0

我有一个模板类,称为Cell,这里的定义:

template <class T>
class OneCell
{
.....
}

我有一个从Cell到 T 的演员表操作员,在这里

virtual operator const T() const
{
   .....
}

现在我有派生类,称为DCell,here

template <class T>
class DCell : public Cell<T>
{
.....
}

我需要覆盖 Cell 的演员表运算符(插入一点 if),但在我需要调用 Cell 的演员表运算符之后。在其他方法中,它应该类似于

virtual operator const T() const
{
    if (...)
    {
        return Cell<T>::operator const T;
    }
    else throw ...
}

但我得到一个编译器错误

错误:“const int (Cell::)()const”类型的参数与“const int”不匹配

我能做些什么?

谢谢你,对我糟糕的英语感到抱歉。

4

4 回答 4

3

您缺少括号,因此编译器认为您正在尝试返回成员函数,而不是调用它。

        return Cell<T>::operator const T();
于 2012-06-19T21:19:53.573 回答
2

你实际上并没有打电话给运营商:

return Cell<T>::operator const T();

完整代码:

template <class T>
class OneCell
{
public:
    virtual operator const T() const
{
        return T();
    }
};

template <class T>
class DCell : public OneCell<T>
{
public:
    virtual operator const T() const
    {
        cout << "operator called";
        return OneCell<T>::operator const T();
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    DCell<int> x;
    int y = (int)x;
}
于 2012-06-19T21:19:46.827 回答
1

考虑以下代码与 和 的Cell实现DCell

#include <iostream>
#include <exception>

template<class T>
class Cell
{
protected:
    T cnt;
public:
    Cell(const T& cnt = T()) : cnt(cnt){}
    virtual operator const T() const { return cnt; }
};

bool test_bool = true;

template<class T>
class DCell : public Cell<T>
{
public:
    DCell(const T& cnt = T()) : Cell<T>(cnt){}
    virtual operator const T() const
    {
        if(test_bool)
        {
            return Cell<T>::operator const T(); // Here you had Cell<T>::operator const T;
        } else {
            throw std::exception();
        }
    }
};

int main()
{
    DCell<int> cell(5);
    std::cout << static_cast<int>(cell) << "\n"; // prints 5 (and a new line)
    return 0;
}
于 2012-06-20T12:19:18.613 回答
0

不要使操作员虚拟。相反,委托给protected virtual辅助函数。

template <class T>
class Cell
{
    public:
        operator const T() const { return cvt_T(); }
    protected:
        virtual const T cvt_T() const;
};

template <class T>
class DCell : public Cell<T>
{
    const T cvt_T() const
    {
        if (...)
        {
            return Cell<T>::cvt_T();
        }
        else throw ...
    }
};

这和其他好的实践可以从 GotW 学习,这里是关于虚拟架构的部分

于 2012-06-19T21:15:58.853 回答