Можете ли вы сказать мне, как явным образом вызывать конструктор шаблонов (в списке инициализаторов)?
например:
struct T {
template<class> T();
};
struct U {
U() : t<void>() {} //does not work
T t;
};
спасибо
Ответ 1
Это невозможно. Стандарт также имеет примечание об этом на 14.8.1/7
[Примечание: поскольку список аргументов явного шаблона следует за именем шаблона функции, а так как шаблоны функций членов-членов и шаблоны-функции-члены-конструкторы вызываются без использования имени функции, нет способа предоставить список шаблонов аргументов шаблона. ]
Объяснение: Это говорит: аргументы шаблона передаются в угловых скобках после имени шаблона функции, такого как std::make_pair<int, bool>. И конструкторы не имеют собственного имени, но они злоупотребляют именами классов в разных контекстах (поэтому U<int>() означает: Pass <int> в шаблон шаблона U и построить объект, вызвав конструктор по умолчанию без аргументов). Поэтому невозможно передать шаблонные аргументы конструкторам.
В вашем случае вы пытаетесь передать аргументы шаблона в инициализаторе члена. В этом случае еще большая проблема: он попытается проанализировать и интерпретировать t<void> как тип базового класса и считает, что вы хотите вызвать конструктор по умолчанию базового класса. Конечно, это провалится.
Если вы можете жить с ним, вы можете работать с ним
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; };