В следующих :
template<typename Type>
struct MyClass
{
template<typename OtherType> MyClass(const MyClass<OtherType>& x);
template<typename OtherType = Type> void test(const MyClass<OtherType>& x);
};
В функции test
что сделано между:
Случай 1 : Параметр по умолчанию является приоритетным: конструктор преобразования MyClass<Type>(const MyClass<OtherType>& x)
косвенно называется и MyClass<Type>::test<Type>(const MyClass<Type>& x)
называется.
Случай 2: Выведенный параметр является приоритетным: MyClass<Type>::test<Type>(const MyClass<OtherType>& x)
называется.
Я думаю, что хороший ответ — второй, но я не уверен. Можете ли вы подтвердить мне это (и что эта ситуация четко определена стандартом)?
РЕДАКТИРОВАТЬ: тестовая функция вызывается:
MyClass<double> d;
MyClass<unsigned int> ui;
d.test(ui); // <- So the question is : is ui implicitely
// converted to MyClass<double> or not ?
test
будет называться
MyClass<double>::test(const MyClass<unsigned int> &)
т.е. не будет никакого преобразования ui
от MyClass<unsigned int>
в MyClass<double>
,
Аргумент шаблона по умолчанию никогда не переопределяет данный. Он используется только тогда, когда не задан аргумент шаблона, и компилятор не может вывести его из аргументов функции.
Из стандарта C ++ 11:
(§14.8.2 / 5) Результирующий замещенный и скорректированный тип функции используется в качестве типа шаблона функции для вывода аргумента шаблона. Если аргумент шаблона не был выведен, используется его аргумент шаблона по умолчанию, если он есть. [ Пример:
template <class T, class U = double> void f(T t = 0, U u = 0); void g() { f(1, ’c’); // f<int,char>(1,’c’) f(1); // f<int,double>(1,0) f(); // error: T cannot be deduced f<int>(); // f<int,double>(0,0) f<int,char>(); // f<int,char>(0,0) }
— конец примера]
Других решений пока нет …