Подтвердить что ты не робот

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

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

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

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

спасибо

4b9b3361

Ответ 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; };