Конструктор шаблона C ++, почему вызывается конструктор копирования? - PullRequest
1 голос
/ 03 апреля 2012

У меня есть класс с конструктором шаблона, и код фактически вызывает конструктор copy после конструктора по умолчанию, что не имеет смысла для меня, так как тип неправильный.

Например:

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 не имеет отношения, преобразования между * не указаны1032 * и / или A:

class B
{
};

1 Ответ

1 голос
/ 03 апреля 2012

Вы не предоставили определение B, поэтому я собираюсь предположить, что A является предком B, а B может быть неявно приведено к A. В этом случае ваш шаблон для B не создается, потому что уже есть идеально подходящий вызов.

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