簡體   English   中英

如何重構我的庫以包含模板?

[英]How can I refactor my library to include templates?

我已經在整個項目中不使用模板的情況下嘗試將模板功能添加到我的矢量類中。

舊版本使用硬編碼的float來保存xyz 我現在想做的是使類也可以通過模板使用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

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

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;

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

以我的經驗來看,你做不到。 您需要將alg::vector更改為alg::vector<> ,這是默認參數的語法。 盡管單個查找和替換應該執行此操作。

暫無
暫無

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

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