2010-05-07 3 views

ответ

35

Это не возможно. Стандарт также записка по этому вопросу на 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; }; 
+0

Thank you.no Biggie, я могу работать вокруг этого – Anycorn

+13

@litb: Вы знаете, есть ли какая-то причина, по которой они просто не позволяют вам прямо называть T :: T ()? –

+0

@JosephGarvin Я подозреваю, потому что 'T()' работает, имея вещь перед скобкой типа, 'Type()' создает временный объект. Это несовместимо с 'T :: T ()' где вещь перед parens является функцией. Смысл этого заключается в вызове именованной функции. Но прямое вызов конструктора бессмысленно, по крайней мере, потребуется дополнительная формулировка, чтобы заставить его работать и делать ожидаемую вещь. –

Смежные вопросы