При поиске примера реализации двоичного дерева я заметил что-то странное в приведенном коде here. В Узел Конструктор структуры переменной типа non-pointer присваивается типу указателя.C++, присвоение не указательного типа указателю-члену класса шаблона
Он компилируется просто отлично (я использую GCC 5.3.0). И то, что меня действительно смутило, заключается в том, что компиляция зависит от параметра другого конструктора, val.
Это не имеет никакого эффекта в методах класса, только в конструкторах:
ошибкаtemplate <typename T>
class Test {
Test* testPtr;
void testMethod(T t, Test<T> notAPointer) { // OK
this->testPtr = notAPointer;
}
void testMethod(Test<T> notAPointer) { // OK
this->testPtr = notAPointer;
}
Test(T t, Test<T> notAPointer) { // OK
this->testPtr = notAPointer;
}
Test(Test<T> notAPointer) { // compilation error
this->testPtr = notAPointer;
}
};
Компиляция я получаю:
invalid constructor; you probably meant ‘Test (const Test&)’
Почему это происходит? Где в стандарте описано это поведение?
Я думаю, что это опечатка. Он компилируется отлично, потому что этот конструктор не вызван. – cpplearner
Какой конструктор вызывается при построении параметра 'notAPointer'? – emlai
Проблема с вашим конструктором не имеет ничего общего с назначением указателя или сопутствующими проблемами. Вы получите ту же ошибку с пустым куском конструктора. Конструктор копирования не может получить свой параметр по значению - это все, что есть в нем, и именно это пытается сказать ваш компилятор. – AnT