Аргументы шаблона, необходимые в типах возвращаемых данных при определении метода

Кто-нибудь знает, почему аргументы шаблона необходимы для возвращаемых типов, а не для типов аргументов при определении методов-шаблонов? Пример:

template<typename T>
struct Car {
  Car drive(Car);  // will be defined after the template declaration.
};

// Attempt #1: does not compile.
// Error: use of class template Car requires template arguments
template<typename T>
inline Car Car<T>::drive(Car) {}

// Attempt #2: compiles!  
// The only difference is the use of template argument in return type.
// However, note that the argument to func does not require template argument!
template<typename T>
inline Car<T> Car<T>::drive(Car) {}

Не уверен, почему аргумент шаблона необходим для возвращаемого типа, но не требуется для типа аргумента. Когда Попытка №1 потерпела неудачу, я ожидал, что Попытка №2 тоже потерпит неудачу, и ожидал, что мне понадобится:

template<typename T>
inline Car<T> Car<T>::drive(Car<T>) {}  // but no need to go this far.

, но Попытка №2 сработала!

Есть ли веская причина для такого поведения?

5
задан kirakun 1 March 2011 в 00:11
поделиться