接收类的对象的“未声明标识符”错误

时间:2017-12-30 08:20:24

标签: c++ templates object

我正在编写一个相当长的程序。 问题是由于某种原因我无法使用头文件 我收到了多个错误。

#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

依旧......

1 个答案:

答案 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);

现在PrightPleft在周围范围内可见。