我正在尝试将模板功能添加到我的vector类中,之后在我的项目中使用它而没有模板。
旧版本使用硬编码float
来保存x
,y
和z
的值。我现在要做的是让类也能够通过模板使用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
答案 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<>
,这是默认参数的语法。虽然单个查找和替换应该这样做。