模板类&模板功能:Point&欧氏距离

时间:2015-01-27 19:02:13

标签: c++ function class templates

我需要帮助理解为什么我的程序不能正常工作。我有一种感觉,问题潜伏在我写得很糟糕的模板功能中,我想纠正它。

通过编写类似的东西来初始化Point类:

Point<int, 2> p1; //where int is the type and 2 is the dimension (in this case 2d)

在我的main函数中,我初始化点并为Point数组中的每个值添加值(例如p1.arr [0] = 3;这就像x = 3)然后我尝试使用我的函数并打印它出来了,但程序不会打开任何东西,编译器也不会说出错误是什么。

#include <iostream>
#include <cmath>
using namespace std;

template<typename T, int n>
class Point
{
public:
    int dimen = n;
    T arr[n];
    Point<>(){};
};

template<typename A>
double euclidean_distance(A a, A b){
    double k = 0;
    for (int i = 0; i < a.dimen; ++i){ //neglecting the fact that a and b may be of
        double op = (b.arr[i] - a.arr[i]); //different dimensions
        k += pow(op, 2);
    }
    return sqrt(k);
}

欧几里得距离方程基于被分析的两个点的维数:

在二维空间中:sqrt((x2 - x1)^ 2 +(y2 - y1)^ 2)

在三维空间中:sqrt((x2 - x1)^ 2 +(y2 - y1)^ 2 +(z2 - z1)^ 2)

1 个答案:

答案 0 :(得分:1)

您的Point语法不正确。您可能希望它看起来像:

template<typename T, int n>
struct Point
{
    static const int dimen = n;
    T arr[n];
    Point(){}; // <== note: no <>
};

在您的实际euclidean_distance方法中,ab实际上不能具有不同的维度,因为维度的数量是该类型的一部分,并且这两个对象属于同一类型,A

如果要将dimen改为static const,您可以将循环更改为:

for (int i = 0; i < A::dimen; ++i) {

或者明确地让你的函数只需要Point s:

template <typename T, int DIM>
double euclidean_distance(const Point<T,DIM>& a,
                          const Point<T,DIM>& b)
{
    double k = 0;
    for (int i = 0; i < DIM; ++i) {
       // etc.
    }
}