簡體   English   中英

模板專業化沒有匹配的構造函數

[英]Template specialization no matching constructor

我正在創建一個模板化的矢量類,大致通過以下方式完成:

// Main class
template <typename T, int DIMS>
class Vector
{
    // Default constructor
    Vector();
    // Data constructor
    Vector(const T data[DIMS]);

    // Other functions, variables, operators
};

// 3d specialization
template <typename T>
class Vector<T, 3>
{
    // Cross product for 3d vectors -- only thing in specialization
    static Vector<T, 3> cross(const Vector<T, 3> a, const Vector<T, 3> b);
};

對於主模板,我有一個默認構造函數以及一個指定元素的構造函數。 當我嘗試使用帶有元素的構造函數進行編譯時,出現錯誤, no matching constructor for initialization of 'Vec3f' (aka 'Vector<float, 3>')

我看過的所有類似問題都表明,構造函數應自動使用模板化類,因此我不確定這里發生了什么。 我以前在沒有模板專門化的類上遇到構造函數錯誤,並且列出了另一個構造函數不可行,這使我認為該構造函數由於某種原因沒有被復制到模板化類中。

部分和顯式專業化不會從主模板繼承任何內容; 它們是完全無關的。 在您的代碼中,除了靜態成員函數之外, Vector<T, 3>是一個完全空的類。

當部分/顯式專業化代碼與主模板共享代碼時,有多種方法可以減少代碼重復(例如,通過從實現共享功能的基類模板繼承),但是在這種情況下,我認為沒有理由編寫部分專業化代碼首先。 只需將cross作為免費功能模板即可:

template <typename T, int DIMS>
class Vector
{
    // Default constructor
    Vector();
    // Data constructor
    Vector(const T data[DIMS]);

    // Other functions, variables, operators
};

template<typename T>
Vector<T, 3> cross(const Vector<T, 3> a, const Vector<T, 3> b);

作為附帶說明, Vector(const T data[DIMS]); 可能不執行您認為的操作-完全等同於Vector(const T *data);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM