0

テンプレート引数 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 のドキュメントには、この状況に適合するものは何も見つかりませんでした。

あなたが私を助けてくれることを願っています。

4

1 に答える 1