2013-12-16 2 views
0

Мы используем пользовательский класс изображений, написанный нашим профессором. Я могу загружать изображения, как этотКак создать переменную объекта из вызова функции?

SimpleGrayImage in("images/uni01.pgm"); 

Теперь у меня есть функция, которая выглядит следующим образом

SimpleGrayImage apply_mask(SimpleGrayImage &img,SimpleFloatImage &mask){ 

и я могу также использует методы на него, как этот apply_mask(...).show();

Но я не имею права сделайте это SimpleGrayImage img = apply_mask(...);

Я что-то пропустил или может быть, что наш профессор забыл добавить другого конструктора?

test.cpp:133:43: error: no matching function for call to ‘SimpleGrayImage::SimpleGrayImage(SimpleGrayImage)’ 
    SimpleGrayImage img = apply_mask(in,mask); 
             ^
test:133:43: note: candidates are: 
In file included from SimpleFloatImage.h:13:0, 
       from aufgabe11_12_13.cpp:13: 
SimpleGrayImage.h:110:2: note: SimpleGrayImage::SimpleGrayImage(const string&) 
    SimpleGrayImage(const std::string& filename); 
^
SimpleGrayImage.h:110:2: note: no known conversion for argument 1 from ‘SimpleGrayImage’ to ‘const string& {aka const std::basic_string<char>&}’ 
SimpleGrayImage.h:91:2: note: SimpleGrayImage::SimpleGrayImage(SimpleGrayImage&) 
    SimpleGrayImage(SimpleGrayImage &img); 
^
SimpleGrayImage.h:91:2: note: no known conversion for argument 1 from ‘SimpleGrayImage’ to ‘SimpleGrayImage&’ 
SimpleGrayImage.h:86:2: note: SimpleGrayImage::SimpleGrayImage(int, int) 
    SimpleGrayImage(int wid, int hig); 
^
SimpleGrayImage.h:86:2: note: candidate expects 2 arguments, 1 provided 
SimpleGrayImage.h:80:2: note: SimpleGrayImage::SimpleGrayImage() 
    SimpleGrayImage(); 
^
SimpleGrayImage.h:80:2: note: candidate expects 0 arguments, 1 provided 
+1

Похоже, вам нужен конструктор копирования. –

+0

Какова полная функциональная подпись 'apply_mask'? –

+0

Было бы полезно, если бы вы заменили '...' фактическими аргументами и покажите нам определение класса. Пока вы на нем, вы можете создать [SSCCE] (http://sscce.org). – jrok

ответ

3

Из ошибок я могу видеть, что конструктор копирования не определен правильно:

SimpleGrayImage::SimpleGrayImage(SimpleGrayImage&) 

Это не будет называться так как значение возвращения из функции apply_mask не локальная переменная но Rvalue.

Для конструктора принять rvalues ​​нужно изменить подпись конструктора копии в

SimpleGrayImage::SimpleGrayImage(const SimpleGrayImage&)//note the new const 

Edit: Для получения дополнительной информации о rvalues ​​вы можете проверить this link. Rvalues ​​можно преобразовать в const SimpleGrayImag& a = apply_mask(), потому что const гарантирует, что вы не можете внести изменения в a, чтобы компилятор мог безопасно предоставить вам адрес этой локальной памяти. Определение без сопзИ может быть использовано только на lvalues, как например:

SimpleGrayImag a;//this is an lvalue; 
SimpleGrayImag b = a; 

Лучший подход заключается в использовании сопзИте на всех аргументах, которые вы не хотите, чтобы они были выходными аргументами. Кроме того, вы можете создавать функции как с версиями const, так и с непостоянными и большую часть времени, когда компилятор вас поймет, однако этого следует избегать, потому что код сложнее читать и понимать.

+0

О, хорошо поймать, +1. – jrok

+0

Да, это помогло. –

+0

Спасибо, только что сделал редактирование, если кто-то хочет получить дополнительную информацию о rvalues – Raxvan

Смежные вопросы