У меня есть структура, которая работает как оболочка для других типов следующим образом:
template<typename T>
struct A {
A& operator=(const T& value){
m_value = value;
return *this;
}
operator T() const {
return m_value;
}
private:
T m_value;
};
Я использую это так:
int main() {
A<int> a;
a = 5; // Copy assignment constructor
std::cout << a << "\n"; // Implicit conversion to int
}
который работает как ожидалось. Моя проблема возникает при использовании нефундаментальных типов, как показано в следующем примере:
int main() {
A<std::complex<int>> c;
c = std::complex<int>(2, 2);
std::cout << c << "\n";
}
Приведенный выше фрагмент вызывает ошибку invalid operands to binary expression.
Почему возникает эта ошибка? Почему не используется перегруженный оператор << для std::complex<int> с неявно преобразованным A<std::complex<int>>?
@YSC Отличное наблюдение! Не стесняйтесь редактировать заголовок этого вопроса.





Операторы потока для std::complex являются шаблонными функциями. Они не будут вызываться, если у вас действительно нет std::complex, поскольку при выводе аргументов шаблона не происходит никаких преобразований. Это означает, что компилятор не найдет подходящей перегрузки для печати A<std::complex<int>>.
Вы первый случай для работы, потому что std::basic_ostream::operator << перегружен, чтобы принять int, и вам разрешено одно определяемое пользователем преобразование - разрешение перегрузки.
В качестве рабочей области вы можете определить свой собственный operator <<, который берет вашу оболочку и направляет ее к operator << базовых типов. Это будет выглядеть как
template<typename T>
std::ostream& operator <<(std::ostream& os, const A<T>& a)
{
return os << static_cast<T>(a);
}
Большое спасибо! Есть ли какой-нибудь способ добиться желаемого поведения?
@datell, самый простой способ - определить template <typename T> operator<<(std::ostream&, A<T> const&);.
@datell Я добавил один к ответу.
Он работает для аргументов шаблона, не являющегося шаблоном,
A, но не для аргументов шаблона шаблона. См. coliru.stacked-crooked.com/a/8ad05b4b564bab1b