2011-08-23 56 views
0

我試圖添加模板功能到我的矢量類,已經在整個我的項目中使用它沒有模板後。我如何重構我的圖書館以包含模板?

舊版本使用硬編碼float來保存x,yz的值。我現在想要做的是讓這個類也能夠通過模板使用double。

我的類定義是這樣的:

namespace alg { 

template <class T=float> // <- note the default type specification 
struct vector 
{ 
    T x, y, z; 
    vector() : x(0), y(0), z(0) {} 
    explicit vector(T f) : x(f), y(f), z(f) {} 
    vector(T x, T y, T z) : x(x), y(y), z(z) {} 

    // etc 
}; 

} 

我希望現在能夠編譯我的項目不需要更改其中的代碼,告訴模板,如果沒有模板使用float每默認參數給出。

不過,我仍然得到錯誤有關缺少模板參數...

#include "vector.hpp" 

int main() { 
    alg::vector a; 
    return 0; 
} 

-

$ g++ -O3 -Wall -Wextra -std=gnu++0x test.cpp 
test.cpp: In function ‘int main()’: 
test.cpp:4:17: error: missing template arguments before ‘a’ 
test.cpp:4:17: error: expected ‘;’ before ‘a’ 

我怎樣才能讓不改變test.cpp此代碼的工作?最好不要使用struct名稱並使用typedef

+1

這不是你的問題的答案,但你有沒有考慮過從'alg :: vector'到'alg :: vector '的直接搜索和替換? –

回答

5

不幸的是,引用沒有尖括號的類模板是非法的。

的STL這是否符合std::string的方法是這樣的,即使你的要求是「沒有重整」:

template <typename T> class basic_string { ... }; 
... 
typedef basic_string<char> string; 

在你的情況,你會寫vector<>無處不在,或重命​​名 模板:

template <class T> 
struct basic_vector { 
    ... 
}; 

typedef basic_vector<float> vector; 
+0

謝謝您的快速回復和很好的示例。那麼我想沒有其他辦法了。 – robrene

+0

我認爲最上面的代碼應該是'template class basic_string {...};' –

+0

@Minging Duck:絕對,謝謝你找到:) –

2

不幸的是,即使您有默認的類型名稱,您也必須編寫alg::vector<>

+0

如果您將模板重命名爲phresnel建議 –

0

在我所有的經驗你不能。您需要將alg::vector更改爲alg::vector<>,這是默認參數的語法。儘管單個查找和替換應該這樣做。