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
が、なぜ整数に対して機能するのかわかりません。)