源自模板

时间:2011-05-12 16:09:42

标签: c++ templates derived

我坚持以下内容并可以使用一些帮助:

typedef unsigned short USHORT;

template <typename DataType>
class Primative
{
protected:
    DataType m_dtValue;
public:
    Primative() : m_dtValue(0) {}

    DataType operator=(const DataType c_dtValue) { return m_dtValue = c_dtValue; }
    DataType Set(const DataType c_dtValue){ return m_dtValue = c_dtValue; }
};

typedef Primative<USHORT> PrimativeUS;

class Evolved : public PrimativeUS
{
public:
    Evolved() {}
};

int main()
{
    PrimativeUS prim;
    prim = 4;

    Evolved evo;
    evo.Set(5);  // good
    evo = USHORT(5); // error, no operator found which takes a right-hand operator...
}

看起来派生类没有得到重载的运算符

2 个答案:

答案 0 :(得分:3)

试试这个:

class Evolved : public PrimativeUS
{
public:
  using PrimativeUS::operator=;
  Evolved() {}
};

为您提供的隐式Evolved::operator=(const Evovled&)隐藏了基类中存在的operator=的所有实例。 (对于任何方法都是如此 - 派生类的方法隐藏了类似命名的基类方法,即使签名不匹配。)

答案 1 :(得分:1)

稍微更改您的功能声明:

DataType operator=(const DataType& c_dtValue) { return m_dtValue = c_dtValue; }
DataType Set(const DataType& c_dtValue){ return m_dtValue = c_dtValue; }

请注意&amp;运算符重载需要(参考)符号。