C ++ vector :: push_back с использованием конструктора копирования по умолчанию - PullRequest
10 голосов
/ 10 июня 2011

У меня есть класс (Uniform), который имеет конструктор с 2 параметрами и конструктор копирования по умолчанию (он содержит только int, float, std :: vector и std :: map). Я создал

std::vector<Uniform> uniforms

, который я хочу заполнить, используя

uniforms.push_back()

линия. Я использую этот код, чтобы сделать это (2-я строка только для того, чтобы проверить конструктор копирования, так как он в настоящее время не работает)

Uniform uni(uniform_name,type);
Uniform uni2=uni;
uniforms.push_back(uni2);

Конструктор по умолчанию работает нормально, "uni2 = uni" компилируется без проблем (поэтому конструктор копирования по умолчанию тоже в порядке), но push_back возвращается (используя g ++ в качестве компилятора):

/ USR / Библиотека / GCC / x86_64-неизвестно-Linux-гну / 4.6.0 /../../../../ включают / C ++ / 4.6.0 / внутр / new_allocator.h: 108: 9: erreur: нет соответствующей функции для вызова 'Uniform :: Uniform (const Uniform &)'

/ USR / Библиотека / GCC / x86_64-неизвестно-Linux-гну / 4.6.0 /../../../../ включают / C ++ / 4.6.0 / внутр / new_allocator.h: 108: 9: примечание: кандидаты:

. / Inc /iform.h: 16: 5: примечание: Uniform :: Uniform (std :: string, Uniform_Type)

. / Inc /iform.h: 16: 5: примечание: кандидат ожидает 2 аргумента, 1 при условии

. / Inc /iform.h: 14: 7: примечание: Uniform :: Uniform (Uniform &)

. / Inc /iform.h: 14: 7: примечание: неизвестное преобразование аргумента 1 из «const Uniform» в «Uniform &»

Спасибо:)

Ответы [ 4 ]

12 голосов
/ 10 июня 2011

Когда вы говорите «конструктор копирования по умолчанию» (что обычно не имеет смысла), я предполагаю, что вы имеете в виду «неявно объявленный конструктор копирования» или «конструктор копирования, предоставляемый компилятором»

Точная подпись компилятораПредоставляемый конструктор копирования будет зависеть от содержимого вашего Uniform класса.Это может быть Uniform::Uniform(const Uniform &) или Uniform::Uniform(Uniform &), опять же, в зависимости от деталей Uniform (которые вы не предоставили).

Например, если ваш Uniform включает подобъект (базовый иличлен) типа T, конструктор копирования которого объявлен как T::T(T &) (без const), тогда неявный конструктор Uniform также будет неявно объявлен как Uniform::Uniform(Uniform &) (без const).

Полная спецификация может быть найдена в стандарте языка (12.8 / 5)

Неявно объявленный конструктор копирования для класса X будет иметь форму

X::X(const X&)

, если

- каждый прямой или виртуальный базовый класс B X имеет конструктор копирования, первый параметр которого имеет тип const B & или const volatile B &, а

- длявсе нестатические члены-данные X, относящиеся к типу класса M (или его массиву), каждый такой тип класса имеет конструктор копирования, первый параметр которого имеет тип const M & или const volatile M &.

В противном случаенеявно объявленный конструктор копирования будет иметь вид

X::X(X&)

Неявно объявленный конструктор копирования является встроенным открытым членом своего класса.

Для реализации push_back требуется Uniform::Uniform(const Uniform &), но что-тов вашем классе это значит Uniform::Uniform(Uniform &).Отсюда и ошибка.Невозможно сказать, что это такое, не видя определения вашего Uniform.

1 голос
/ 10 июня 2011

Ваш конструктор копирования должен принимать свой аргумент как const ссылка:

Uniform::Uniform(const Uniform& other)
1 голос
/ 10 июня 2011

Ваш конструктор копирования должен принимать const Uniform&, а не Uniform& как тот, который у вас есть.

0 голосов
/ 10 июня 2011

Вам не удалось включить конструктор копирования (sic !!!), но вы, должно быть, определили его неправильно:

Uniform::Uniform(Uniform&)
{
     ....
}

должно быть (обратите внимание на const )

Uniform::Uniform(const Uniform&)
{
     ....
}
...