C++ вызывает явного шаблонного конструктора

Можно ли сказать мне, как вызвать шаблонного конструктора явно (в списке инициализатора)? например:

struct T { 
    template<class> T();
};

struct U {
    U() : t<void>() {} //does not work
    T t;
};

спасибо

44
задан Anycorn 7 May 2010 в 07:33
поделиться

1 ответ

Это невозможно. В Стандарте также есть примечание по этому поводу на 14.8.1 / 7

[Примечание: поскольку явное Список аргументов шаблона следует за именем шаблона функции, и поскольку шаблоны функций-членов преобразования и шаблоны функций-членов конструктора вызываются без использования имени функции, невозможно предоставить явный список аргументов шаблона для этих шаблонов функций. ]

Объяснение : Здесь говорится: Аргументы шаблона передаются в угловых скобках после имени шаблона функции, например std :: make_pair . И у конструкторов нет собственного имени, но они злоупотребляют своими именами классов в различных контекстах (поэтому U () означает: передать классу template U и создайте объект, вызвав конструктор по умолчанию без аргументов). Следовательно, нельзя передавать аргументы шаблона конструкторам.

В вашем случае вы пытаетесь передать аргументы шаблона в инициализаторе члена. В этом случае возникает еще большая проблема: он попытается проанализировать и интерпретировать t как тип базового класса и думает, что вы хотите вызвать конструктор по умолчанию базового класса. Конечно, это не удастся.

Если вы можете жить с этим, вы можете обойти его

struct T { 
    template<class U> T(identity<U>);
};

struct U {
    U() : t(identity<void>()) {}
    T t;
};

Учитывая идентичность , как это определено в boost

template<typename T> struct identity { typedef T type; };
45
ответ дан 26 November 2019 в 22:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: