如何重构我的库以包含模板?

时间:2011-08-23 13:57:52

标签: c++ templates

我正在尝试将模板功能添加到我的vector类中,之后在我的项目中使用它而没有模板。

旧版本使用硬编码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

3 个答案:

答案 0 :(得分:5)

不幸的是,引用没有尖括号的类模板是非法的。

STL使用std::string执行此操作的方式是这样的,即使您的请求是“没有错误”:

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

在您的情况下,您必须在任何地方写vector<>,或重命名您的。{1}} 模板:

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

typedef basic_vector<float> vector;

答案 1 :(得分:2)

不幸的是,即使您有默认的类型名称,也必须写alg::vector<>

答案 2 :(得分:0)

在我的所有经历中你都做不到。您需要将alg::vector更改为alg::vector<>,这是默认参数的语法。虽然单个查找和替换应该这样做。