私は現在、Java コードを C++ コードに変換するためのコードをいくつか書いています。私の質問は、含まれているクラスからテンプレート化された値を返すオーバーロードされた演算子を持つことは可能ですか?
すなわち:私は次のクラスで次のことができるようにしたいです。
SmartPointer<ArrayClass<bool>*> boolArray = new ArrayClass<bool>(true, true, false, false);
bool b = boolArray[1];
template <typename T> class SmartPointer
{
T data;
template <typename U>
U operator [](int i) const
{
return ((*T)(*data))[index];
}
}
template ArrayClass<U>
{
// Various constructors...
U operator [](int i) const
{
// Implementation here
}
}
エラー C2783: 'U SmartPointer::operator const' : could not deduce template argument for 'U' bool - これは ArrayClass が返すものであるためです。SmartPointer には配列が含まれていない可能性があり、その場合 [] 演算子は意味がありません。ただし、スマート ポインター内のオブジェクトにそれを渡すことができるようにしたい場合に備えて... ?
これを機能させるために何をすべきかわかりません。もしかして無理??
答え:
回答してくださった皆様、ありがとうございました。本質的に同じ 3 つのソリューションが提供されていますが、最初に参加した Oktalist にこれを授与します。ただし、SmartPointer クラスにポインターを渡して前方宣言されたクラスを使用できるようにするため、このソリューションにはまだ問題があります。これにより、戻り値の型として T::value_type を使用できなくなりましたが、それが正しい方法のようです。コンパイラの多くに質問しているように見えますが、配列アクセスを行うには、単純にスマートポインタの逆参照に戻る必要があるようです!