Проблема с Векторами и пользовательскими классами в c ++ с тривиальным конструктором [duplicate]

0

У меня проблема с использованием векторов с настраиваемым классом, который я создаю. Вот мой код

vector<image> frames;


int i = 0;
while (i < n) {
  image tempImage;
  tempImage.read(fullname);
  frames.push_back(tempImage);
}

И конструктором для изображения является только изображение() {};

Я уверен, что мне не хватает чего-то простого, но я не могу понять, что это такое. Вот мои ошибки

/usr/include/c++/4.2.1/ext/new_allocator.h:107:20: error: no matching constructor for initialization of 'image'
  { ::new(__p) _Tp(__val); }
               ^   ~~~~~
/usr/include/c++/4.2.1/bits/stl_vector.h:604:20: note: in instantiation of member function
  '__gnu_cxx::new_allocator<image>::construct' requested here
        this->_M_impl.construct(this->_M_impl._M_finish, __x);
                      ^
video.cpp:50:10: note: in instantiation of member function 'std::vector<image, std::allocator<image> >::push_back'
  requested here
            frames.push_back(tempImage);
                   ^
./image.h:25:4: note: candidate constructor not viable: 1st argument ('const image') would lose const qualifier
image(image &img);
^
./image.h:24:4: note: candidate constructor not viable: requires 0 arguments, but 1 was provided
image();
^
In file included from video.cpp:1:
In file included from ./video.h:6:
In file included from /usr/include/c++/4.2.1/vector:73:
/usr/include/c++/4.2.1/bits/vector.tcc:252:8: error: no matching constructor for initialization of 'image'
      _Tp __x_copy = __x;
          ^          ~~~
/usr/include/c++/4.2.1/bits/stl_vector.h:608:4: note: in instantiation of member function 'std::vector<image,
  std::allocator<image> >::_M_insert_aux' requested here
      _M_insert_aux(end(), __x);
      ^
video.cpp:50:10: note: in instantiation of member function 'std::vector<image, std::allocator<image> >::push_back'
  requested here
            frames.push_back(tempImage);
                   ^
./image.h:25:4: note: candidate constructor not viable: 1st argument ('const value_type' (aka 'const image')) would
  lose const qualifier
image(image &img);
^
./image.h:24:4: note: candidate constructor not viable: requires 0 arguments, but 1 was provided
image();
^
./image.h:26:4: note: candidate constructor not viable: requires 2 arguments, but 1 was provided
image(int rows, int columns);
^
2 errors generated.
Теги:
templates
vector

4 ответа

3
Лучший ответ

Убедитесь, что вы поставляете ссылку & в своем конструкторе копирования:

image(const image& other);

Кажется, вы могли бы перейти от значения const.

Если image является просто тривиальным классом, попробуйте удалить все формы конструкторов; автоматически созданные должны работать нормально.

  • 1
    На самом деле, нет (сначала я думал то же самое): конструктор копирования определен с const ссылкой.
  • 0
    @KonradRudolph Неявная будет создана как неконстантная ссылка, но допустимо иметь ее как константную ссылку (но не по значению). С ++ 11, 12.8.2
Показать ещё 3 комментария
0

image должен иметь конструктор копирования. Стандарт С++ 11 (раздел 12.8) определяет, как они могут выглядеть:

class X
{
public:
    X(); // default constructor

    X(const X& x); // const-reference copy constructor
    X(X& x); // non-const copy constructor
    X(volatile X& x); // volatile reference copy constructor
    X(const volatile X& x); // const volatile reference copy constructor
    X(const X& x, int i = 0); // can use any of the above with defaulted values as well
};

Если вы определили конструктор move, но не конструктор-копию, для вас не будет создан неявный конструктор-копир (и оператор копирования-назначения не будет создан неявно), если вы не определили оператор копирования-назначения.

Если вы более подробно рассмотрите следующую часть ошибки:

./image.h:25:4: note: конструктор-кандидат не является жизнеспособным: 1-й аргумент ('const image') потеряет const-идентификатор (image & img);

По-видимому, вы объявили (недопустимый) конструктор копирования как image(const image), но пытаетесь передать ему неконсольную ссылку. Измените объявление конструктора копии на image(const image&) и, скорее всего, устраните эту проблему.

В качестве альтернативы, если у вас есть конструктор копирования и оператор присваивания копии, объявленный как закрытый/защищенный, вы получите аналогичные ошибки (т.е. Вы сделали свой класс не скопированным). Чтобы удержать любой объект X в контейнере STL, X должен быть скопирован (поэтому вы не можете поместить auto_ptr в контейнер)

  • 0
    Первый бит звучит неправильно: определение (не копируемого) конструктора не повлияет на созданный компилятором конструктор.
  • 0
    @juanchopanza Написал, что перед обедом, и он не передает то, что я хотел ... Я это исправлю.
0

Возможно, вам нужно реализовать конструктор копирования? т.е. Image (const Image & _other);

0

Если вы используете С++ 11, я рекомендую вызывать конструктор явно через image tempImage{}; , В противном случае вы находитесь в цикле бесконечного, так как вы никогда не увеличиваете i.

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

  • 0
    image tempImage{}; и image tempImage; одинаковы для определенного пользователем типа.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню