C ++模板问题

时间:2011-03-07 17:14:44

标签: c++ templates

我得到了作业,我必须为多维向量写一个类

我被告知我必须使用模板,这对我来说是全新的,确切地说,我必须使用template <unsigned short n>,其中n定义了我的矢量有多少维度。

到目前为止,我有这个,但它不起作用:

vector.h

#include <vector>

template <unsigned short n>
class Vector {
public:
    std::vector<float> coords;

    Vector<n>();

};

vector.cpp

 #include "vector.h"

 Vector<n>() {
 for(int i = 0; i < n; i++) {
     coords.push_back(0.0);
 }
};

我的默认构造函数使矢量线变为0.0

我在矢量上得到错误。 cpp C:\CodeBlocks\kool\praks3\vector.cpp|3|error: 'n' was not declared in this scope|

此外 ..为什么我必须在这里使用模板,我阅读模板教程,它用于优化代码并减少代码重复,但这里的n必须始终是unsigned short

当我看这个例子时,我明白我使用模板,因为我的数据类型可以是我想要的任何东西,我可以将它用于整数,双打或任何类型的数字

但是目前使用模板有什么意义,当我定义了必须使用的数据类型时???

template <class dataType>
dataType GetMin (dataType a, dataType b) {
return ((a < b) ? a : b );
}

如果有什么不清楚的地方,请随时向我询问! 因为我有很多困惑:)

3 个答案:

答案 0 :(得分:2)

你可能被告知在这里使用模板不是因为这是正确的事情,但因为这样做应该有希望教你如何使用它们。具体而言,教师试图向您展示模板可以采用某些非类型参数。

您的问题虽然与模板关系不大,而且与不了解如何构建C ++类有关。在类中定义函数时,需要使用范围语法:

// non-templated vector
Vector::Vector()
{
  ...
}

那是问题1.问题2是你试图在cpp文件中定义模板功能。你不能这样做。您必须将函数定义放在标题中(减去几个案例,我会让您的老师稍后讨论)。

接下来您需要了解的是std::vector已经有一个可以使用的质量初始化程序而不是for循环:

std::vector<float> my_vect(42, 0.0); // builds a vector with 42 floats all initialized to 0.0

使用这些线索,你应该能够解决你的家庭作业问题。

答案 1 :(得分:2)

您应该首先阅读模板:http://www.cplusplus.com/doc/tutorial/templates/

模板很不错,因为它们使您可以使用泛型类型。例如,使用相同的代码获取两个对象(int,long,float等)的最大值或最小值。在你的情况下,使用模板是个好主意,因为它可以让你拥有整数,浮点数,双精度或任何你喜欢的矢量。

另一方面,使用模板时最简单的方法是将标题和实现保留在同一个文件(标题)中。

您的构造函数Vector<n>();未正确说明。因为您的类之前有template <unsigned short n>,所以您在其中编写的所有内容都将使用该模板。

template <unsigned short n>
class Vector {
public:
  // Here..    
};

所以只需像通常那样编写构造函数。

答案 2 :(得分:1)

回答:使用模板有什么意义,当我定义了必须使用哪种数据类型时

你的班级没有任何意义,因为它是写的。我本来希望看到要存储的类型和(可能)大小作为模板参数。

template <class T, unsigned short n>
class MyVector {
...
}