0

C# プロパティを模倣する方法をテストしており、次のpropertyクラスを作成しています。

struct BY_REF
{
    template <class T>
    struct TT_s
    {
        typedef T &TT_t;
    };
};
struct BY_VAL
{
    template <class T>
    struct TT_s
    {
        typedef T TT_t;
    };
};

template <class T, class P=BY_REF>
class property
{
private:
    typedef typename P::template TT_s<T>::TT_t TT;
    T &value;
    property();
    property(const property &);
    property &operator=(const property &);
public:
    explicit property(T &v) : value(v) {}
    operator const TT() const
    {
        return value;
    }
    TT operator=(const TT i)
    {
        return value = i;
    }
};

このクラスを次のコードでテストしました。

int main()
{
    int i;
    std::string s;
    property<int, BY_VAL> I(i);
    property<std::string> S(s);
    //stringproperty S(s);
    I = 1337;
    char c[] = "I am ";
    S = std::string(c);
    cout << /*S <<*/ I << endl;
    return 0;
}

これにより、行で予期しないコンパイラ エラー " no match for 'operator='..." が発生しますS = std::string(c);S問題がより単純なように見えるため、の印刷をコメントアウトしました。operator=その解決策で問題も解決されることを願ってoperator<<います。何が起こっているのかを把握するために、次のようにテンプレートを手動でインスタンス化しました。

class stringproperty
{
private:
    std::string &value;
    stringproperty();
    stringproperty(const stringproperty &);
    stringproperty &operator=(const stringproperty &);
public:
    explicit stringproperty(std::string &v) : value(v) {}
    operator const std::string &() const
    {
        return value;
    }
    std::string &operator=(const std::string &i)
    {
        return value = i;
    }
};

私の手動バージョンは機能します。テンプレートバージョンがそうでない理由を誰か説明できますか? BY_REF(これはandクラスと関係があると思われますBY_VALが、なぜ整数に対して機能するのかわかりません。)

4

1 に答える 1

4

手動バージョンに誤りがあり、問題はテンプレートとは関係ありません。

typedef int& IntRef;

const int& == int const&

const IntRef == IntRef const == int& const

違いに気づきましたか?したがって、問題はそこにありますTT operator=(const TT i)

typedef一般的なガイドラインは、を単純なテキスト置換として扱いたい場合は、今すぐ開始する必要があるということです。それが修飾するタイプの後にを置きconstます。

于 2012-05-29T13:51:21.893 に答える