template <typename T>
struct Colordata
{
public:
T *data;
unsigned long size;
unsigned long length;
template <size_t N>
Colordata(T (&arr)[N])
{
length = N;
size = sizeof(arr);
T dataArr[length];
for (int i = 0; i < N; i++)
{
dataArr[i] = arr[i];
}
data = dataArr;
}
template <typename TCast>
operator TCast() const
{
TCast dataCastTmp[length];
for (int i = 0; i < length; i++)
{
dataCastTmp[i] = (TCast)data[i];
}
return Colordata<TCast>(dataCastTmp);
}
};
int main(int argc, char const *argv[])
{
int arr[] = {12, 434, 54};
auto a = Colordata<int>(arr);
auto b = (float)a;
return 0;
}
私が変換しようとしたときStruct<typename>
にStruct<another typename>
別の型名は存在しません。私はそう思います 'cos私はコンパイラログでエラーを受け取ります:
«Colordata :: Colordata(float [((const Colordata *)this)-> Colordata :: length])»を呼び出すための一致する関数がありません
テンプレート構造体をテンプレート構造体にキャストする方法はありますか?
このコードには多くの問題がありますが、変換演算子の署名が原因で、あなたが尋ねた問題が発生しています。
template <typename TCast>
operator TCast() const
あなたがキャストにしようとするとColordata<float>
、その後TCast
型になりますColordata<float>
、そしてないfloat
実装が想定しているよう。
解決策は、他のColordata
インスタンス化への変換のみを許可することです。
template <typename TCast>
operator Colordata<TCast>() const
今すぐTCast
となりfloat
、必要に応じて、あなたが一歩近づく正しいコードにしています。
その他の問題は、可変長配列(C ++ではサポートされていません)の使用、およびスコープを超えて未定義の動作につながるローカル変数へのポインターの格納です。std::vector
生活をより簡単かつ安全にするために使用します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加