我正在编写一个相当长的程序。 问题是由于某种原因我无法使用头文件 我收到了多个错误。
#include <iostream>
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
using namespace std;
template <typename P>
class marray {
public:
P* a;
int length;
int mid;
marray(int len)
{
length = len;
a = new P[length];
}
P& operator[](int i)
{
assert(i >= 0 && i < length);
return a[i];
}
marray<P>& operator=(marray<P>& b)
{
if (a != NULL)
delete[] a;
a = b.a;
b.a = NULL;
length = b.length;
return *this;
}
};
template <typename T>
class newtype {
T x;
T y;
public:
T getx() { return x; };
T gety() { return y; };
newtype& operator=(newtype& b)
{
x = b.x;
y = b.y;
};
void setx(T X)
{
x = X;
};
void sety(T Y)
{
y = Y;
};
};
template <typename T>
class RangeTree;
template <typename T>
class Node {
public:
Node()
{
left = NULL;
right = NULL;
point = NULL;
}
newtype<T> key;
Node* left;
Node* right;
RangeTree<T>* point;
};
template <typename T>
class RangeTree {
Node<T>* root;
int size;
public:
RangeTree(Node<T>* v)
{
root = v;
}
void setsize(int SIZE) { size = SIZE; };
int getsize() { return size; };
};
template <typename T>
Node<T>* BUILD2DRANGETREE(marray<newtype<T> > P)
{
Node<T>* v = new Node<T>;
RangeTree<T>* assoc = new RangeTree<T>(BUILDASSOC(MergeSort(P, 0, P.length - 1, 'y')));
v->point = assoc;
if (P.length == 1)
v->key = P[0];
else {
int i;
int k;
if (P.length % 2 == 0) {
P.mid = P.length / 2 - 1;
marray<newtype<T> > Pleft(P.length / 2), Pright(P.length / 2);
}
else {
P.mid = P.length / 2;
marray<newtype<T> > Pleft(P.length / 2 + 1), Pright(P.length / 2);
}
for (i = 0; i <= P.mid; i++)
Pleft[i] = P[i];
for (; i < P.length; i++)
Pright[k++] = P[i];
ν->left = BUILD2DRANGETREE(Pleft);
ν->right = BUILD2DRANGETREE(Pright);
v->key = P[P.mid];
}
return ν;
}
这不是完整的代码。
问题是:
错误1错误C2065:'Pleft':未声明的标识符f:\ rangetreee \ rangetreee \ source.cpp 106 1 Rangetreee
错误2错误C2065:'Pright':未声明的标识符f:\ rangetreee \ rangetreee \ source.cpp 108 1 Rangetreee
错误3错误C2065:'ν':未声明的标识符f:\ rangetreee \ rangetreee \ source.cpp 110 1 Rangetreee
错误10错误C2065:'νsplit':未声明的标识符f:\ rangetreee \ rangetreee \ source.cpp 218 1 Rangetreee
依旧......
答案 0 :(得分:2)
您的代码稍微重新格式化,看起来像
if(P.length%2==0)
{
P.mid=P.length/2 -1;
marray<newtype<T>> Pleft(P.length/2),Pright(P.length/2);
}
else
{
P.mid=P.length/2;
marray<newtype<T>> Pleft(P.length/2 +1),Pright(P.length/2);
}
错误的直接原因是每个Pleft
超出了最接近}
范围的范围。
如果我们查看传递给Pleft
构造函数的值,我们可以看到在两种情况下它实际上都是P.mid + 1
。所以代码可以重写:
if(P.length%2==0)
{
P.mid=P.length/2 -1;
}
else
{
P.mid=P.length/2;
}
marray<newtype<T>> Pleft(P.mid + 1),Pright(P.length/2);
现在Pright
和Pleft
在周围范围内可见。