Конструктор шаблона C++, почему вызывается конструктор копирования?
У меня есть класс с конструктором шаблона, и код фактически вызывает конструктор копирования после конструктора по умолчанию, что не имеет смысла для меня, так как тип неправильный.
Например:
class A
{
public:
A(void); // default constructor
A(const A& other); // copy constructor
template<class TYPE>
A(const TYPE& object_to_ref); // template constructor
};
Этот конструктор шаблона работает (правильно вызывается в других случаях), но не распознается как "правильный" конструктор из другой функции шаблона:
template<class TYPE>
A& CreateA(const TYPE& object_to_ref)
{
// THIS FUNCTION IS NEVER SPECIALIZED WITH "A", ONLY WITH "B" !!
return *new A(object_to_ref); // CALLS "A::A(const A&)" !!??
}
Пример сбоя:
B my_b;
A& my_a = CreateA(my_b); // "A::A(const A&)" called, not "A::A(const B&)"!
Это не имеет смысла для меня. Типы неверны, чтобы соответствовать конструктору копирования. Что случилось? (MSVC2008)
Мой обходной путь - не использовать конструктор шаблона в этом случае:
template<class TYPE>
A& CreateA(const TYPE& object_to_ref)
{
A* new_a = new A(); //DEFAULT CONSTRUCTOR
new_a->setObjectToRef(object_to_ref); //OTHER TEMPLATE MEMBER FUNCTION
return *new_a;
}
ВОПРОС: Почему конструктор шаблона в этом случае не вызывался?
(Кажется, что обходной путь ведет себя правильно, вы предлагаете альтернативу?)
РЕДАКТИРОВАТЬ: B
не связано, без преобразований, указанных между B
и / или A
:
class B
{
};
1 ответ
Вы не предоставили определение B
так что я иду вперед, предполагая, что A
является B
предок и B
может быть неявно приведен к A
, В этом случае ваш шаблон для B
не создается, потому что уже есть совершенно подходящий вызов.