#c #class #map #stl
#c #класс #Карта #stl
Вопрос:
Я новичок в c . Я не очень разбираюсь в использовании карт или других контейнеров stl. В моей программе я определил один class group
и один map<int,group>mymap
Это очень длинный код, и большая его часть не имеет значения, поэтому я привожу небольшую его часть, которая выглядит следующим образом:
map<int, group>idgroup;
class group; //forward reference
class user
{
private:
int w;
int d;
float p;
public:
int present_gid;
friend void calcprice(int*, int);
}c[50];
class group
{
private:
int g_id;
int td;
public:
vector<int>members;
group* next;
group()
{
td = 0;
next = NULL;
}
}
void calcp(int* id, int n)
{
int gid,Td;
float p=0.01,q=0.1,r=8,cpu;
for(int i=0; i<n; i )
{
gid = c[id[i]].present_gid;
group g = idgroup.find(gid)->second;
Td = g.td;
cpu = (p*pow(Td,2) q*Td r)/Td;
c[id[i]].p = cpu*c[id[i]].d;
}
}
int main()
{
int n;
cin>>n;
int *grp_id = new int[n];
calcp(grp_id, n);
return 0;
}
Когда я даю объявление карты перед class
, я получаю следующую ошибку:
error:‘group’ was not declared in this scope
map<int, group>mymap;
и когда я даю прямое объявление класса, я получаю следующую ошибку:
error: forward declaration of ‘class group’
class group;
Я не могу понять, в чем проблема. Пожалуйста, помогите. Спасибо!
Комментарии:
1. Вы уверены, что вторая ошибка не связана с «ошибка: недопустимое использование неполного типа»?
2. Покажите больше вашего кода и предоставьте фактические сообщения об ошибках. Является
mymap
ли поле внутриgroup
?3. @jposeph да, это связано с «ошибкой: недопустимое использование неполного типа»
4. Объявленный (в отличие от определенного) тип является неполным и не может использоваться в качестве типа значения в std::map (и других контейнерах). Вы должны полностью определить класс, прежде чем сможете создать его карту, (прямого) объявления недостаточно.
Ответ №1:
Я думаю, у вас есть решения в зависимости от контекста.
- Сохраните прямое объявление для класса group как есть и объявите свой mymap как std::map < int, group *> . Наличие типа указателя в вашем коде было бы проблематичным. Зависит от контекста.
- Удалите прямое объявление и включите заголовочный файл, который содержит объявление class group. Кажется, это может быть справедливым решением для вас. Опять же, зависит от контекста. Если необходимо скрыть включение файла заголовка, чтобы оптимизировать эффективность времени компиляции. Это не подходит.
Комментарии:
1. все мои объявления классов находятся в одном файле.