Это один из не выводимых контекстов. Аргумент шаблона T
не может быть выведен компилятором.
Задайте этот вопрос себе: когда вы пишете это,
do_some_stuff( theElement );
какой тип аргумента, по вашему мнению, должен быть вычтен из T
?
Вы, наверное, думаете T=float
? Ну, это только одна возможность. Там может существовать специализация для шаблона класса:
//the compiler cannot assume that such specialization doesn't exist!
template<>
struct telement<someType>
{
typedef {
float element;
float some_value;
} type;
};
Тогда даже в этом случае вложенный тип telement<someType>::type
совпадает с telement<float>::type
. Вы видите двусмысленность? Не существует единой связи между T
и вложенным type
. На самом деле может быть много-одно отношение. Может быть много T
, для которых вложенный тип будет таким же, идентичным.
Итак, учитывая вложенный тип, как компилятор может определить аргумент шаблона? Не может
В SO уже есть несколько тем, объясняющих подобные ситуации, см. Эти:
Решение состоит в том, чтобы просто написать шаблон функции как:
template<typename T>
float do_some_stuff( const T& x) {
// ...
}
В конце концов, какой смысл писать telement<T>::type
в параметре?