Добавление этой переменной экземпляра в заголовок файла C ++ 11 поднимает компилятор на всю стену. Зачем?

Я пытался заставить мою программу искусственного интеллекта (написанную на C ++ 11) перестать выдавать сообщения об ошибках больше, чем мой терминал запишет. Я угасал методы по одному, пока сообщение не исчезло, и, следовательно, нашел точную линию, которая заставляет компьютер сходить с ума. Вот соответствующая часть моего кода:

#include <iostream>
#include <vector>
#include <algorithm>
#include <math.h>

class H
{
public:
H(int);
int get_val();
private:
int val;
};

class Hvote
{
public:
Hvote() : error(1.0) { }
std::vector<H&> hs;
double error;
};

int main()
{
Hvote hvote;
return 0;
}

Для меня все это выглядит разумно. Однако компилятор (g ++) не согласен. Сообщения об ошибках настолько длинные, что мой Терминал даже не пытается сохранить начало, поэтому я не знаю их истинную длину. Тем не менее, они довольно повторяющиеся. Например, последняя страница гласит:

/usr/include/c++/4.8/bits/stl_vector.h: In instantiation of ‘class std::vector<H&>’:
hvote.h:16:25:   required from here
/usr/include/c++/4.8/bits/stl_vector.h:237:20: error: no members matching ‘std::vector<H&>::_Base {aka std::_Vector_base<H&, std::allocator<H&> >}::_M_allocate’ in ‘std::vector<H&>::_Base {aka struct std::_Vector_base<H&, std::allocator<H&> >}’
using _Base::_M_allocate;
^
/usr/include/c++/4.8/bits/stl_vector.h:238:20: error: no members matching ‘std::vector<H&>::_Base {aka std::_Vector_base<H&, std::allocator<H&> >}::_M_deallocate’ in ‘std::vector<H&>::_Base {aka struct std::_Vector_base<H&, std::allocator<H&> >}’
using _Base::_M_deallocate;
^
/usr/include/c++/4.8/bits/stl_vector.h:878:7: error: forming pointer to reference type ‘H&’
data() _GLIBCXX_NOEXCEPT
^
/usr/include/c++/4.8/bits/stl_vector.h:886:7: error: forming pointer to reference type ‘H&’
data() const _GLIBCXX_NOEXCEPT
^
/usr/include/c++/4.8/bits/stl_vector.h:919:7: error: ‘void std::vector<_Tp, _Alloc>::push_back(std::vector<_Tp, _Alloc>::value_type&&) [with _Tp = H&; _Alloc = std::allocator<H&>; std::vector<_Tp, _Alloc>::value_type = H&]’ cannot be overloaded
push_back(value_type&& __x)
^
/usr/include/c++/4.8/bits/stl_vector.h:901:7: error: with ‘void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = H&; _Alloc = std::allocator<H&>; std::vector<_Tp, _Alloc>::value_type = H&]’
push_back(const value_type& __x)
^
/usr/include/c++/4.8/bits/stl_vector.h: In instantiation of ‘std::vector<_Tp, _Alloc>::~vector() [with _Tp = H&; _Alloc = std::allocator<H&>]’:
hvote.h:10:7:   required from here
/usr/include/c++/4.8/bits/stl_vector.h:416:30: error: ‘struct std::_Vector_base<H&, std::allocator<H&> >::_Vector_impl’ has no member named ‘_M_start’
_M_get_Tp_allocator()); }
^
/usr/include/c++/4.8/bits/stl_vector.h:416:30: error: ‘struct std::_Vector_base<H&, std::allocator<H&> >::_Vector_impl’ has no member named ‘_M_finish’
/usr/include/c++/4.8/bits/stl_vector.h: In instantiation of ‘std::_Vector_base<_Tp, _Alloc>::~_Vector_base() [with _Tp = H&; _Alloc = std::allocator<H&>]’:
/usr/include/c++/4.8/bits/stl_vector.h:416:33:   required from ‘std::vector<_Tp, _Alloc>::~vector() [with _Tp = H&; _Alloc = std::allocator<H&>]’
hvote.h:10:7:   required from here
/usr/include/c++/4.8/bits/stl_vector.h:161:33: error: ‘struct std::_Vector_base<H&, std::allocator<H&> >::_Vector_impl’ has no member named ‘_M_start’
- this->_M_impl._M_start); }
^
/usr/include/c++/4.8/bits/stl_vector.h:161:9: error: ‘struct std::_Vector_base<H&, std::allocator<H&> >::_Vector_impl’ has no member named ‘_M_start’
- this->_M_impl._M_start); }
^
/usr/include/c++/4.8/bits/stl_vector.h:161:9: error: ‘struct std::_Vector_base<H&, std::allocator<H&> >::_Vector_impl’ has no member named ‘_M_end_of_storage’
/usr/include/c++/4.8/bits/stl_vector.h:161:33: error: ‘_M_deallocate’ was not declared in this scope
- this->_M_impl._M_start); }
^

Тем не менее, есть только одно небольшое изменение, которое мне нужно сделать, чтобы все это прошло. В hvote.hпросто удалите строку, std::vector<H&> hs;, Теперь все работает отлично! В чем проблема с этой линией? (В моей не уменьшенной и гораздо более оригинальной программе, hs переменная мне нужна, в отличие от здесь, где я соединил все методы hvote что пользуюсь)
Спасибо!

2

Решение

У вас проблема с сохранением вектора неконстантных ссылок

std::vector<H&> hs;

Я бы предложил сохранить вектор значений или указатели, в зависимости от того, хотите ли вы иметь эти H экземпляры или просто ссылаться на них.

std::vector<H> hs;
std::vector<H*> hs;
5

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


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