Это невозможно. Стандарт также имеет примечание по этому вопросу на 14.8.1/7
[Примечание: поскольку явный список аргументов шаблона следует за именем шаблона функции, а также потому, что шаблоны функций-членов преобразования и шаблоны функций-членов-конструкторов вызываются без использования имени функции, невозможно предоставить явный список аргументов шаблона для этих функций. шаблоны функций. ]
Объяснение : здесь написано: Аргументы шаблона передаются в угловых скобках после имени шаблона функции, например std::make_pair<int, bool>
. И конструкторы не имеют своих собственных имен, но они злоупотребляют именами своих классов в различных контекстах (поэтому U<int>()
означает: передать <int>
в шаблон класса U
и создать объект, вызвав конструктор по умолчанию без аргументы). Следовательно, нельзя передавать аргументы шаблона конструкторам.
В вашем случае вы пытаетесь передать аргументы шаблона в инициализаторе члена. В этом случае возникает еще большая проблема: он попытается проанализировать и интерпретировать t<void>
как тип базового класса и подумает, что вы хотите вызвать конструктор по умолчанию базового класса. Это, конечно, не удастся.
Если вы можете жить с этим, вы можете обойти это
struct T {
template<class U> T(identity<U>);
};
struct U {
U() : t(identity<void>()) {}
T t;
};
Учитывая identity
как это определено в boost
template<typename T> struct identity { typedef T type; };