Проблемы с пониманием, откуда пришел конструктор копирования - PullRequest
2 голосов
/ 08 октября 2010

У меня есть следующий маленький код:

template <typename T>
class V
{
    public:
        T x;

    explicit V(T & _x)
    :x(_x){}

};

int main()
{
    V<float> b(1.0f); // fails
    return 0;
}

И это происходит неудачно. Сообщение, возвращаемое g ++ 4.4.5:

g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "../main.cpp"
../main.cpp: In function ‘int main()’:
../main.cpp:19: error: no matching function for call to ‘V<float>::V(float)’
../main.cpp:10: note: candidates are: V<T>::V(T&) [with T = float]
../main.cpp:6: note: V<float>::V(const V<float>&)

Дело в том ... откуда появился второй конструктор? Я действительно понятия не имею ...

Ответы [ 2 ]

6 голосов
/ 08 октября 2010

В других ответах обсуждается, почему вы получаете ошибку во время компиляции (о чем большинство вопросов, когда такие ошибки являются наиболее заметной частью вопроса).Тем не мение.Что касается вашего явного вопроса, «откуда появился второй конструктор?»:

12.8 / 4 «Копирование объектов класса» стандарта говорит:

Если определение класса явно не объявляетконструктор копирования, один объявляется неявно.

Если вы хотите избежать использования неявного copy-ctor, можно использовать один из нескольких «не копируемых» идиом (например, boost::noncopyable): http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-copyable_Mixin

4 голосов
/ 08 октября 2010

Компилятор предоставил вашему классу конструктор копирования и оператор присваивания.Он пытается сопоставить этот конструктор копирования с вашим оператором в main.Проблема этого кода в том, что в конструкторе класса V вы берете параметр как неконстантную ссылку.Когда вы делаете V<float> b(1.0f), компилятор создает неназванную временную переменную типа float для значения 1.0f.Однако это неназванное временное не может быть связано с неконстантной ссылкой, оно может быть связано только с константной ссылкой.Следовательно, вам нужно изменить сигнатуру конструктора на explicit V(const T & _x).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...