Допустим, у меня есть какой-то такой код:
#include <iostream>
struct foo {
int n;
foo(int n) : n(n) {}
};
template <class T>
struct bar {
T n;
bar(T n) : n(n) {}
};
foo operator * (foo u, foo v) {
return foo(u.n * v.n);
}
template <class T>
bar<T> operator * (bar<T> u, bar<T> v) {
return bar<T>(u.n * v.n);
}
int main() {
foo x = 1;
std::cout << (x * 2).n << std::endl;
bar<int> y = 2;
std::cout << (y * 3).n << std::endl;
}
Часть с foo
работает, а часть с bar
— нет. Что я делаю не так, и можно ли вообще как-то сделать оператор, который будет делать implicit cast одного из аргументов к bar<T>
в случае, если другой уже им является?