У меня проблема с использованием векторов с настраиваемым классом, который я создаю. Вот мой код
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.
Убедитесь, что вы поставляете ссылку &
в своем конструкторе копирования:
image(const image& other);
Кажется, вы могли бы перейти от значения const.
Если image
является просто тривиальным классом, попробуйте удалить все формы конструкторов; автоматически созданные должны работать нормально.
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
в контейнер)
Возможно, вам нужно реализовать конструктор копирования? т.е. Image (const Image & _other);
Если вы используете С++ 11, я рекомендую вызывать конструктор явно через image tempImage{};
, В противном случае вы находитесь в цикле бесконечного, так как вы никогда не увеличиваете i
.
Кроме того, вы можете попытаться явно удалить свой конструктор по умолчанию и дать компилятору синтезировать его для вас, чтобы узнать, что произойдет.
image tempImage{};
и image tempImage;
одинаковы для определенного пользователем типа.
const
ссылкой.