C++ ostream和操作符std::basic_string<;char,std::char_traits<;char>;,std::分配器<;char>>;? >,我学到了 STD::String 只是 STD::Basic String >,模板参数替换不考虑用户定义的转换,所以编译器不能从类型矩形中推断类型图、特征或分配器,因此此超载不参与过载解决方案。

C++ ostream和操作符std::basic_string<;char,std::char_traits<;char>;,std::分配器<;char>>;? >,我学到了 STD::String 只是 STD::Basic String >,模板参数替换不考虑用户定义的转换,所以编译器不能从类型矩形中推断类型图、特征或分配器,因此此超载不参与过载解决方案。,c++,C++,现在,我将std::basic_string、std::allocator>替换为std::string: class Rectangle { public: Rectangle(double x, double y) : _x(x), _y(y) {} operator std::basic_string<char, std::char_traits<char>, std::allocator<char>> () { retu

现在,我将std::basic_string、std::allocator>替换为std::string:

class Rectangle
{
public:
    Rectangle(double x, double y) : _x(x), _y(y) {}
    operator std::basic_string<char, std::char_traits<char>, std::allocator<char>> () {
        return std::basic_string<char, std::char_traits<char>, std::allocator<char>>(to_string(_x) + " " + to_string(_y));
    }
    //operator double() {
    //  return _x;
    //}
private:
    double _x, _y;
    double getArea() { return _x * _y; }
};

int main()
{
    Rectangle r(3, 2.5);
    cout << r << endl;
    return 0;
}
类矩形
{
公众:
矩形(双x,双y):x(x),y(y){
运算符std::基本字符串(){
返回std::basic_字符串(to_字符串(_x)+“”+to_字符串(_y));
}
//运算符双(){
//返回x;
//}
私人:
双倍x,y;
double getArea(){return\ux*\uy;}
};
int main()
{
矩形r(3,2.5);
库特
现在我用std::basic_string、std::allocator>替换std::string:
它仍然失败,为什么

您误解了原始问题。这不是因为您使用了
std::string
而不是直接的
std::basic_string
。typedef只是现有类型的另一个名称。您的两个转换运算符完全相同。您可以通过尝试将它们都放在类定义中来验证是否会导致重新定义初始化错误

在解决
运算符的重载时,这两种情况都不考虑
现在我用std::basic_string、std::allocator>替换std::string:
它仍然失败,为什么

您误解了原始问题。这不是因为您使用了
std::string
而不是直接的
std::basic_string
。typedef只是现有类型的另一个名称。您的两个转换运算符完全相同。您可以通过尝试将它们都放在类定义中来验证是否会导致重新定义初始化错误

在为
运算符解决重载时,这两者都不考虑。运算符首先找到一组可能调用的函数。在此阶段,将执行模板推断,以确定模板是否是可能的候选模板

然后,如果找到多个函数,则在尝试查找候选函数中最接近的匹配时,将考虑转换函数

在您的例子中,使用
std::string
的运算符永远不会被视为编译器无法从
矩形
推断
图表


解决方案是跳过转换运算符,而是添加一个
运算符首先查找一组可能要调用的函数。在此阶段,将执行模板推断,以确定模板是否是可能的候选模板

然后,如果找到多个函数,则在尝试查找候选函数中最接近的匹配时,将考虑转换函数

在您的例子中,使用
std::string
的运算符永远不会被视为编译器无法从
矩形
推断
图表



一个解决方案是跳过转换运算符,而是添加一个
运算符。您可以定义
std::ostream&operator您可以定义
std::ostream&operator。标准中有相应的文本吗?我试图通过重载解析和模板进行解析,但找不到任何内容。@不可计算-它是和的组合,wh我现在很难准确地指出。“不可计算的,但它仍然是完全不明显的:”“不可计算的——如果我们是知道的,如果不是很明显的话,它就不会是C++,它会吗?):在标准中有相应的文本吗?我试图通过重载解析和模板解析,但是找不到任何。@不可计算的-它是一个COM。BO和一些东西,我很难在此刻找到答案。“不可计算的,尽管它仍然是完全不明显的:”“不可计算的——如果我们是显而易见的,它不是C++,我们喜欢它,它会吗?”
template <class CharT, class Traits, class Allocator>
std::basic_ostream<CharT, Traits>& 
    operator<<(std::basic_ostream<CharT, Traits>& os, 
               const std::basic_string<CharT, Traits, Allocator>& str);