namespace NonTemplate
{
struct T1{};
struct T2
{
operator T1(){ return T1(); }
};
T2 operator*(const T1&, const T1&){ return T2(); }
}
namespace Template
{
template <typename T>
struct T1{};
template <typename T>
struct T2
{
operator T1<T>(){ return T1<T>(); }
};
template <typename T>
T2<T> operator*(const T1<T>&, const T1<T>&){ return T2<T>(); }
// Раскомментировать вот эту строчку и ошибки не будет
// T2<int> operator*(const T1<int>&, const T1<int>&){ return T2<int>(); }
}
int main()
{
{
NonTemplate::T1 t1;
NonTemplate::T2 t2;
t1 * t2; // ok
}
{
Template::T1<int> t1;
Template::T2<int> t2;
t1 * static_cast<Template::T1<int>>(t2); // ok
t1 * t2; // error (я где-то косячу в объявлении шаблонов?)
}
}
bmFtZXNwYWNlIE5vblRlbXBsYXRlCnsKCXN0cnVjdCBUMXt9OwoKCXN0cnVjdCBUMgoJewoJCW9wZXJhdG9yIFQxKCl7IHJldHVybiBUMSgpOyB9Cgl9OwoKCVQyIG9wZXJhdG9yKihjb25zdCBUMSYsIGNvbnN0IFQxJil7IHJldHVybiBUMigpOyB9Cn0KCm5hbWVzcGFjZSBUZW1wbGF0ZQp7Cgl0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KCXN0cnVjdCBUMXt9OwoKCXRlbXBsYXRlIDx0eXBlbmFtZSBUPgoJc3RydWN0IFQyCgl7CgkJb3BlcmF0b3IgVDE8VD4oKXsgcmV0dXJuIFQxPFQ+KCk7IH0KCX07CgoJdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CglUMjxUPiBvcGVyYXRvciooY29uc3QgVDE8VD4mLCBjb25zdCBUMTxUPiYpeyByZXR1cm4gVDI8VD4oKTsgfQoJCgkvLyDQoNCw0YHQutC+0LzQvNC10L3RgtC40YDQvtCy0LDRgtGMINCy0L7RgiDRjdGC0YMg0YHRgtGA0L7Rh9C60YMg0Lgg0L7RiNC40LHQutC4INC90LUg0LHRg9C00LXRggoJLy8gVDI8aW50PiBvcGVyYXRvciooY29uc3QgVDE8aW50PiYsIGNvbnN0IFQxPGludD4mKXsgcmV0dXJuIFQyPGludD4oKTsgfQp9CgppbnQgbWFpbigpCnsKCXsKCQlOb25UZW1wbGF0ZTo6VDEgdDE7CgkJTm9uVGVtcGxhdGU6OlQyIHQyOwoJCXQxICogdDI7IC8vIG9rCgl9Cgl7CgkJVGVtcGxhdGU6OlQxPGludD4gdDE7CgkJVGVtcGxhdGU6OlQyPGludD4gdDI7CgkJdDEgKiBzdGF0aWNfY2FzdDxUZW1wbGF0ZTo6VDE8aW50Pj4odDIpOyAvLyBvawoJCXQxICogdDI7IC8vIGVycm9yICjRjyDQs9C00LUt0YLQviDQutC+0YHRj9GH0YMg0LIg0L7QsdGK0Y/QstC70LXQvdC40Lgg0YjQsNCx0LvQvtC90L7Qsj8pCgl9Cn0=
prog.cpp: In function 'int main()':
prog.cpp:42:6: error: no match for 'operator*' (operand types are 'Template::T1<int>' and 'Template::T2<int>')
t1 * t2; // error (я где-то косячу в объявлении шаблонов?)
^
prog.cpp:25:8: note: candidate: template<class T> Template::T2<T> Template::operator*(const Template::T1<T>&, const Template::T1<T>&)
T2<T> operator*(const T1<T>&, const T1<T>&){ return T2<T>(); }
^
prog.cpp:25:8: note: template argument deduction/substitution failed:
prog.cpp:42:8: note: 'Template::T2<int>' is not derived from 'const Template::T1<T>'
t1 * t2; // error (я где-то косячу в объявлении шаблонов?)
^