我需要帮助理解为什么我的程序不能正常工作。我有一种感觉,问题潜伏在我写得很糟糕的模板功能中,我想纠正它。
通过编写类似的东西来初始化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)
答案 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
。
如果要将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.
}
}