Оператор преобразования шаблона в классе шаблона с конструктором по умолчанию? - PullRequest
0 голосов
/ 02 декабря 2011

Мне нужен шаблонный класс с оператором шаблонного преобразования и конструктором по умолчанию, но моя первоначальная попытка не работает.

template<typename T>
class C
{
public:
    C() {}

    template<typename U>
    operator U() 
    {
        C<U> c; // (*)
        c._a = dynamic_cast<U*>(_a); 
        return c;
    }
private:
    T* _a;
};

Но теперь, когда я пытаюсь создать экземпляр C,

template<typename T>
void F()
{
    ...
    C<T> obj;
}

Оператор U () продолжает вызывать себя снова и снова в (*), в конечном счете, с ошибками.То же самое происходит, когда я определяю функцию, которая выполняет приведение извне, и вызываю ее из оператора U () - в этом случае нет вызова C :: C () из определения класса.

Тогда мне кажется, что оператор преобразования вызывается, когда я хочу вызвать конструктор по умолчанию - он, по сути, пытается преобразовать себя.Но, конечно же, есть способ сделать то, что я пытаюсь сделать?

1 Ответ

1 голос
/ 02 декабря 2011

Обратите внимание, что в функциях operator X (где X - тип) вы обычно должны возвращать что-то типа X.Вы возвращаете C<U>, когда пытаетесь преобразовать вызывающий объект в U, что приводит к следующему:

  1. int a = someC; (где someC - это C любого типа) попытается присвоить C<X> для int
  2. operator T<int> будет вызван на someC, который вернет C<int>, а затем попытается присвоить егоint
  3. operator T<int> будет вызвано для вышеупомянутого возвращаемого значения, которое возвратит C<int>
  4. Это возвращаемое значение, которое является C<int>, будет пытаться преобразоваться в int, который вызовет operator T<int> ....
  5. goto 3;

Надеемся, вы сможете понять, почему происходит бесконечная рекурсия и последующее переполнение стека.

Вы не можете вернуть C<U> из operator T<U> класса C.Вам нужно изменить класс, если вам нужно по какой-то причине.

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