【发布时间】:2014-02-23 03:14:28
【问题描述】:
我正在尝试覆盖基类函数。派生类型和基类型都返回指针,因此根据我在 google 和 stackoverflow 上阅读的一些帖子,它应该是协变的。
但是在 MSVC2013 中为以下课程:
class PSBaseObject
{
public:
PSBaseObject() {}
virtual ~PSBaseObject() {}
virtual void* data() { return this; }
virtual const void* data() const { return this; }
};
template<typename T>
class PSObject : public PSBaseObject
{
private:
T* data_;
public:
PSObject(T* object) : data_(object) {}
~PSObject() { delete data_; }
T* data() { return data_; }
const T* data() const { return data_; }
};
我收到一个错误:
'PSObject<data>::data': overriding virtual function return type differs and is not covariant from 'PSBaseObject::data'
其中数据的定义和使用如下:
typedef struct
{
void* hFileMap;
void* pData;
std::size_t size;
} data;
data* info = new data();
auto ptr = new PSObject<data>(info);
为什么它不是协变的?
任何想法我在MSVC2013 做错了什么?代码在g++ 4.8.1 中编译并运行良好。
【问题讨论】:
-
void*与T*不协变——错误是否清楚? -
如果是真的,为什么要用 g++ 编译和运行:ideone.com/TwTBRQ
-
@CantChooseUsernames:因为 g++ 没有遵循标准。
标签: c++