テンプレート引数 T=int* を使用して CBaseInterface (以下のコードを参照) から派生させると、コンパイラはエラー C2555 で失敗します。これは、T に使用されるすべてのポインター型で発生します。代わりに typedef を使用すると、同じコードが正常に機能します。
// If _FALIS is defined, the compiler fails, else it succeeds
// (MS Visual Studio 2013 Update 2, 32 and 64 Bit native C++, Debug build).
#define _FALIS
#ifdef _FALIS
#define PINT int*
#else
typedef int* PINT;
#endif
template <class T>
class CBaseInterface
{
public:
virtual ~CBaseInterface() {}
virtual const T Calculate() const = 0;
};
class CCalculator : public CBaseInterface<PINT>
{
public:
CCalculator() {}
virtual ~CCalculator() {}
// error C2555: 'CCalculator::Calculate':
// overriding virtual function return type differs and is not 'covariant'
// from 'CBaseInterface<int *>::Calculate'
virtual inline const PINT Calculate() const final
{
return (PINT)&m_Item;
}
protected:
int m_Item = 0;
};
ポインター型の問題はどこにありますか? 私は混乱しており、Microsoft のドキュメントには、この状況に適合するものは何も見つかりませんでした。
あなたが私を助けてくれることを願っています。