C ++ вызывает явный конструктор шаблона - PullRequest
42 голосов
/ 07 мая 2010

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

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

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

спасибо

1 Ответ

44 голосов
/ 07 мая 2010

Это невозможно. Стандарт также имеет примечание по этому вопросу на 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; };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...