2015-01-27 2 views
-2

Мне нужна помощь, чтобы понять, почему моя программа не будет работать. У меня такое чувство, что проблема скрывается в моей плохо написанной функции шаблона, и я хочу ее исправить.Шаблонные классы и функции шаблона: Точка и эвклидовое расстояние

Класс точка инициализируется писать что-то вроде:.

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

В моей основной функции я инициализировать точки и добавить значения для каждого значения в массиве 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); 
} 

Евклидов уравнение расстояния основано на измерениях двух точек анализируемый:

В 2-мерном пространстве: SQRT ((х2 - х1)^2 + (у2 - у1)^2)

В 3-мерном пространстве: SQRT ((х2 - х1)^2 + (у2 - у1)^2 + (z2 - z1)^2)

+2

Так что это проблема? Кстати, вам не нужно сохранять измерение точки в каждом точечном объекте. Вы можете использовать для этого элемент статических данных. – juanchopanza

+0

, честно говоря, вам даже не нужен член, это часть типа. Во всяком случае, вопрос будет полезен. –

ответ

1

Ваш синтаксис Point является неправильным. Вы, вероятно, хотите, чтобы это выглядело как:

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

В вашем фактическом euclidean_distance метода, a и b на самом деле не может быть разных размеров, так как число измерений является частью типа и оба из этих объектов одного и того же типа , A.

С изменением сделать dimenstatic 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. 
    } 
} 
+0

Тем не менее, код OP shoud «работает» без изменений. – juanchopanza

+0

@juanchopanza По крайней мере, конструктор ошибочен. И я не уверен, что OP использует C++ 11, поэтому декларация 'dimen', вероятно, тоже неверна. – Barry