2017-05-04 61 views
0

進行了搜索,但無法找到與我的查詢匹配的內容,這有點特殊,所以在這裏。將運算符從一個模板類轉換爲另一個相關模板類

我有一些模板類(Vector2,Vector3和Vector4)。 試圖定義從Vector2轉換操作者3和4, 和的Vector3至2和4等

template <typename T> 
class Vector4 { 
    // ... 
    operator Vector2<T>() const { return { x, y }; } 
    operator Vector3<T>() const { return { x, y, z }; } 
    // ... 
    T x, y, z, w; 
    // ... 
} 


template <typename T> 
class Vector3 { 
    // ... 
    operator Vector2<T>() const { return { x, y }; } 
    operator Vector4<T>() const { return { x, y, z, 0 }; } 
    // ... 
    T x, y, z; 
    // ... 
} 


template <typename T> 
class Vector2 { 
    // ... 
    operator Vector3<T>() const { return { x, y, 0 }; } 
    operator Vector4<T>() const { return { x, y, 0, 0 }; } 
    // ... 
    T x, y; 
    // ... 
} 

使用Visual Studio 2017給我此:

錯誤C2833:「運算Vector2'不是公認的運營商或類型

任何和所有幫助表示讚賞。

謝謝。

編輯:我的實際源確實有分號後的分號。忘了把它們放在我發佈的簡短版本中。 而且,是的,有很多錯誤,但以我的經驗,它通常是重要的 嘗試着宣佈第一個:

template <class T> class Vector 3; 
template <class T> class Vector 4; 

template <typename T> 
class Vector2 { 
// ... 
} 

編輯:現在,我得到錯誤C2988:無法識別的模板聲明/定義。可能值得一提的是,3個模板類都在單獨的文件中。我最初嘗試在一個類中包含一個頭文件來讓類型轉換操作符工作,這就是給出原始錯誤的原因。

哦,是的。我一定會讓這些明確的。這總是很好的建議。這是當地時間0430雖然... :)

編輯:無所謂,我是一個spaz。我不知道我是如何在向量和「向量2」!=「向量2」的變暗數之間滑入一個空格。它是前向聲明。不能相信我錯過了那麼簡單的事情。 孩子們:不要編碼,當你如此捆綁,其itos noso好。

+0

你可能要考慮申報的經營者[' explicit'](http://en.cppreference.com/w/cpp/language/explicit)。 –

+0

它應該給出更多的錯誤信息。我可以看到你應該至少得到10個......用分號關閉類定義。編譯器在聲明之前無法識別類型。 –

回答

1

當您聲明Vector4<T>::operator Vector2<T>() const;時,在聲明它之前,您正在使用類Vector2<T>。同樣的事情發生在Vector4<T>::operator Vector3<T>() const;。向前申報你的課程。

// Forward declarations 
template<class T> class Vector2; 
template<class T> class Vector3; 

template <typename T> 
class Vector4 { 
    // ... 
    operator Vector2<T>() const { return{ x, y }; } 
    operator Vector3<T>() const { return{ x, y, z }; } 
    // ... 
    T x, y, z, w; 
    // ... 
}; 


template <typename T> 
class Vector3 { 
    // ... 
    operator Vector2<T>() const { return{ x, y }; } 
    operator Vector4<T>() const { return{ x, y, z, 0 }; } 
    // ... 
    T x, y, z; 
    // ... 
}; 


template <typename T> 
class Vector2 { 
    // ... 
    operator Vector3<T>() const { return{ x, y, 0 }; } 
    operator Vector4<T>() const { return{ x, y, 0, 0 }; } 
    // ... 
    T x, y; 
    // ... 
}; 
+0

謝謝。那樣做了。不能相信我錯過了它。 –

0

你有循環依賴。
您可以通過在一個「方向」上使用轉換構造函數來解決它。
這一個使用構造函數增加尺寸,轉換運營商爲他們降低:(插入有關隱式轉換的危險嚴厲的警告這裏)

template <typename T> 
class Vector2 { 
    T x, y; 
}; 

template <typename T> 
class Vector3 { 
    Vector3(const Vector2<T>& v2) : x(v2.x), y(v2.y), z(0) {} 
    operator Vector2<T>() const { return { x, y }; } 
    T x, y, z; 
}; 

template <typename T> 
class Vector4 { 
    Vector4(const Vector2<T>& v2) : x(v2.x), y(v2.y), z(0), w(0) {} 
    Vector4(const Vector3<T>& v3) : x(v3.x), y(v3.y), z(v3.z), w(0) {} 
    operator Vector2<T>() const { return { x, y }; } 
    operator Vector3<T>() const { return { x, y, z }; } 
    T x, y, z, w; 
}; 

+0

儘管我將FrançoisAndrieux的答案標記爲正確的答案(它看起來更像是一個前向聲明而不是圓形的依賴問題),但是我喜歡的解決方案有一定的優雅,而且事實上,最終使用。感謝你們兩位。我也明確表示了轉換,因爲我100%同意。使用其他民族代碼時,我不止一次對意外轉換感到驚訝。 –