Можно ли сказать мне, как вызвать шаблонного конструктора явно (в списке инициализатора)? например:
struct T {
template<class> T();
};
struct U {
U() : t<void>() {} //does not work
T t;
};
спасибо
Это невозможно. В Стандарте также есть примечание по этому поводу на 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; };