Это не возможно. Стандарт также записка по этому вопросу на 14.8.1/7
[Примечание: поскольку явный список аргументов шаблона следует имя шаблона функции, а также потому, что шаблоны функций членов преобразования и шаблоны функций-членов конструктора называют без имени функции, нет способа предоставить явный список аргументов шаблона для этих шаблонов функций. ]
Если вы можете жить с этим, вы можете работать вокруг
struct T {
template<class U> T(identity<U>);
};
struct U {
U() : t(identity<void>()) {}
T t;
};
Учитывая identity
, как это определено в импульс
template<typename T> struct identity { typedef T type; };
Thank you.no Biggie, я могу работать вокруг этого – Anycorn
@litb: Вы знаете, есть ли какая-то причина, по которой они просто не позволяют вам прямо называть T :: T()? –
@JosephGarvin Я подозреваю, потому что 'T()' работает, имея вещь перед скобкой типа, 'Type()' создает временный объект. Это несовместимо с 'T :: T()' где вещь перед parens является функцией. Смысл этого заключается в вызове именованной функции. Но прямое вызов конструктора бессмысленно, по крайней мере, потребуется дополнительная формулировка, чтобы заставить его работать и делать ожидаемую вещь. –