0

ウィキブックス( http://en.wikibooks.org/wiki/C%2B%2B_Programming/Operators/Operator_Overloading )のサンプルコードを試していますが、VisualStudioでコンパイルされません。このコードは、アドレス、参照、およびポインター演算子(、、および)のオーバーロードに関するoperator&()ものoperator*()ですoperator->()

//file example.cpp
#include "stdafx.h"
#include <iostream>

class T {
public:
    const void memberFunction() const {
        std::cout << "Hello!\n";
    }
};

// forward declaration
class DullSmartReference;

class DullSmartPointer {
private:
    T *m_ptr;
public:
    DullSmartPointer(T *rhs) : m_ptr(rhs) {};
    DullSmartReference operator*() const {
        return DullSmartReference(*m_ptr);
    }
    T *operator->() const {
        return m_ptr;
    }
};

class DullSmartReference {
private:
    T *m_ptr;
public:
    DullSmartReference (T &rhs) : m_ptr(&rhs) {}
    DullSmartPointer operator&() const { // error C2027: use of undefined type 'DullSmartReference'
        return DullSmartPointer(m_ptr);
    }
    // conversion operator
    operator T() { return *m_ptr; }
};


int _tmain(int argc, _TCHAR* argv[])
{
    DullSmartPointer dsp(new T);
    dsp->memberFunction(); // calls T::memberFunction

    T t;
    DullSmartReference dsr(t);
    dsp = &dsr;
    t = dsr; // calls the conversion operator

    std::cin.get();

    return 0;
}

Visual Studioは、常にコンパイラエラーC2079を報告します。エラーメッセージは

1> e:\ projects \ bad \ example.cpp(20):エラーC2027:未定義のタイプ「DullSmartReference」の使用
1> e:\ projects \ bad \ example.cpp(13):「DullSmartReference」の宣言を参照
1> e:\ projects \ bad \ example.cpp(21):エラーC2440:'':「T」から「DullSmartReference」に変換できません
1>ソースまたはターゲットのタイプが不完全です

どうすればエラーを修正できますか?VS 2010を使用していますが、バージョンは重要ではないと思います。ありがとう!

更新: 1。コードを更新し、エラーメッセージを完了しました。

4

2 に答える 2

1

DullSmartReferenceこの行でオブジェクトを返そうとしているため:

DullSmartReference operator*() const

定義はなく、前方宣言だけです。

したがって、

C2079:指定された識別子は、未定義のクラス、構造、または共用体です。

于 2013-02-13T05:29:30.353 に答える
1

その例の間違いは(少なくとも与えられているように)、DullSmartReference定義される前に使用されていることです。C2079行では、を構築して返すことを試みていますがDullSmartReference、これはその定義なしでは不可能です。これを修正するには、コードのその部分は次のようになります。

// forward declaration
class DullSmartReference;

class DullSmartPointer {
private:
    T *m_ptr;
public:
    DullSmartPointer(T *rhs) : m_ptr(rhs) {};
    DullSmartReference operator*() const;   // DullSmartReference not used yet
    T *operator->() const {
        return m_ptr;
    }
};

// DullSmartReference definition goes here

DullSmartReference DullSmartPointer::operator*() const {
    return DullSmartReference(*m_ptr);  // OK; we have the definition by now
}
于 2013-02-13T05:31:46.807 に答える