簡體   English   中英

ostream和運算符std :: basic_string <char, std::char_traits<char> ,std :: allocator <char> &gt;?

[英]ostream and operator std::basic_string<char, std::char_traits<char>, std::allocator<char>>?

答案中 ,我了解到std::string只是std::basic_string<char, std::char_traits<char>, std::allocator<char>> typedef,模板參數替換不考慮用戶定義的轉換,因此編譯器無法從Rectangle類型推斷出CharT,Traits或Allocator類型,因此此重載不參與重載解析。

現在我用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;
}

它仍然失敗。 為什么?

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);

現在我用std :: basic_string,std :: allocator>代替std :: string:
它仍然失敗。 為什么?

您誤解了原來的問題。 這不是因為您使用了std::string而不是直接使用std::basic_string<char, std::char_traits<char>, std::allocator<char>> typedef只是現有類型的另一個名稱。 您的兩個轉換運算符完全相同。 您可以通過嘗試將它們都放置在類定義中來驗證,這將導致重新定義錯誤。

解決operator<<的重載時,不會同時考慮到這兩者,因為轉換不會應用於模板函數排序。

重載解析 首先找到一組可能要調用的函數。 在此階段,執行模板推導以查看模板是否為可能的候選者。

然后,如果找到一個以上的函數,則在嘗試尋找候選中最接近的匹配項時考慮轉換函數。

在您的情況下,從不考慮采用std::string的運算符,因為編譯器無法從Rectangle推導CharT等。


一種解決方案是跳過轉換運算符,而是為Rectangle添加operator<< 在其中,您可以調用os << to_string(...等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM