template <typename T>
struct Colordata
{
public:
T *data。
無符號 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<other typename>時,另一個typename并不存在。我認為是這樣的,因為我在編譯器日志中得到了錯誤:
呼叫 "Colordata::Colordata(float [((const Colordata*)this)->Colordata::length]) "沒有匹配的函式
是否有辦法將模板結構鑄造為模板結構?
uj5u.com熱心網友回復:
這段代碼有很多問題,但你問的那個問題是因為轉換運算子的簽名而發生的:
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可以使生活變得更容易和更安全。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/316124.html
標籤:
