почему программа не может видеть глобальную переменную?

здесь, в моем коде, программа не может переменной n, и я удивлен, почему это происходит?

#include<iostream>
#include<vector>
using namespace std;
int d=3;
int n=12;

template<class T>
class pqi
{
vector<int>pq;
vector<int>qp;
vector<T>&a(n);
void exch(int i,int j)
{
int t=pq[i];
pq[i]=pq[j];
pq[j]=t;
qp[pq[i]]=i;
qp[pq[j]]=j;
}
void fixup(int k)
{
while(k>1 && a[pq[(k+d-2)/d]]>qp[pq[k]])
{
exch(k,(k+d-2)/d);k=(k+d-2)/d;
}
}
void fixdown(int k,int n)
{
int j;
while((j=d*(k-1)+2)<=n)
{
for(int i=j+1;i<j+d&& i<=n;i++)
if(a[pq[j]]>a[pq[i]]) j=i;
if(!(a[pq[k]]>a[pq[j]])) break;
exch(k,j);k=j;
}
}
public:
pqi(int n,const vector<T>&a,int d=3):a(a),pq(n+1,0),qp(n+1,0),n(0),d(d){}
int empty() const
{
return n==0;
}
void insert(int v)
{
pq[++n]=v ;
qp[v]=n;
fixup(n);
}
int getmin()
{
exch(1,n);
fixdown(1,n-1);
return pq[--n];
}
void lower(int k)
{
fixup(qp[k]);
}
};
int main()
{
vector<int>s(n);
pqi<int>a(n,s,d);
for(int i=0;i<12;i++)
a.insert(rand()%(RAND_MAX+i));
while(!a.empty())
{
cout<<a.getmin()<<"  ";;
}

return 0;
}

я объявил вне кода как глобальную переменную, но он может это увидеть и говорит

1>c:\users\\documents\visual studio 2012\projects\multiway_heap\multiway_heap\multiway_heap.cpp(12): error C2061: syntax error : identifier 'n'
1>          c:\users\\documents\visual studio 2012\projects\multiway_heap\multiway_heap\multiway_heap.cpp(62) : see reference to class template instantiation 'pqi<T>' being compiled
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

действительно я не могу понять такое поведение, пожалуйста, помогите мне уточнить, что я делаю неправильно

0

Решение

 vector<T>&a(n);

Что это должно быть? Ты пытаешься … что? Это не объявление переменной, ни объявление функции — и даже если бы это было одно из них, n не было бы там места.

2

Другие решения

vector<T>&a(n);

Не уверен, что вы пытались сделать с этим, но похоже, что вы пытались инициализировать вектор с размером n, что вы не можете сделать за пределами конструктора (потому что он не статичен).

1

Проблема в том, что

vector<T>&a(n);

неправильный способ инициализации переменной-члена. Вы должны использовать конструктор для этого. Тем не менее, я вижу две правдоподобные версии:

  1. Вы на самом деле имели в виду vector<T> a;то есть не ссылка к вектору. В этом случае вы можете инициализировать переменную целым числом, например

    pqi :: pqi (): a (n) {}

  2. Вы делать нужна ссылка на вектор — в этом случае вам нужно инициализировать его другим вектором (ссылки не могут быть восстановлены, только инициализированы), который вы можете передать в свой конструктор, например

    pqi :: pqi (std :: vector &v): a (v) {}

1
По вопросам рекламы [email protected]