Конструктор шаблона 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 не создается, потому что уже есть совершенно подходящий вызов.

Другие вопросы по тегам