簡體   English   中英

為類中定義的typedef定義ostream operator <<

[英]Defining ostream operator<< for typedef defined in the class

任何人都可以提供一個提示如何在提供的代碼示例中正確實現operator << for MyType?

#include <iostream>
#include <map>


template <typename T>
class A {
public:
    typedef std::map<unsigned int, T> MyType;
    MyType data;

    void show();
};

template <typename T>
std::ostream& operator<<(std::ostream& stream, typename A<T>::MyType const& mm)
{
    return stream << mm.size() << "\n";
}

//template <typename T>
//std::ostream& operator<<(std::ostream& stream, std::map<unsigned int, T> const& mm)
//{
//  return stream << mm.size() << "\n";
//}

template <typename T>
void A<T>::show() {std::cout << data;}

int main() {
    A<double> a;

    a.show();

    return 0;
}

上面的代碼不能編譯。 但是當我將operator <<的定義更改為注釋掉時,一切都正常。 這只是一個更復雜的問題的一個(非)工作示例,實際上MyType更加令人討厭。 在這個簡單的例子中,我可以很容易地從'A'類中復制粘貼MyType的精確定義,但是在更復雜的情況下,當這個typedef依賴於antoher typedef時......引用它會很好。 有沒有解決這個問題的方法?

編輯:

來自編譯器的輸出錯誤(通常好像操作符<<根本沒有定義,因此當來自示例的operator <<的兩個定義都被注釋掉時,編譯器會輸出相同的錯誤)。

g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++14 -MMD -MP -MF"src/ostreamTest.d" -MT"src/ostreamTest.o" -o "src/ostreamTest.o" "../src/ostreamTest.cpp"
../src/ostreamTest.cpp:27:31: error: invalid operands to binary expression ('ostream' (aka 'basic_ostream<char>') and 'MyType' (aka 'map<unsigned int, double>'))
    void A<T>::show() {std::cout << data;}
                       ~~~~~~~~~ ^  ~~~~

問題是未推斷的上下文(感謝PasserBy的鏈接),這使我們無法找到直接的解決方案。

解決方法可能是將typedef移出類,例如:

template <typename T>
using A_MyType = std::map<unsigned int, T>;

template <typename T>
class A
{
public:
    typedef A_MyType<T> MyType;
    MyType data;

    void show();
};

template <typename T>
std::ostream& operator<<(std::ostream& stream, A_MyType<T> const& mm)
{
    return stream << mm.size() << std::endl;
}

當然,這適用於std :: map,如果它適用於你更復雜的類 - 在不知道更多細節的情況下不可能說...

所以我正在做這個作為答案

#include <iostream>
#include <map>

template <typename T>
class A{
public:

    using MyType = std::map<unsigned int, T>;
    MyType data;

    void show();

    friend std::ostream& operator<<(std::ostream& stream, const MyType& mm){
        return stream << mm.size() << "\n";
    }
};

template <typename T>
void A<T>::show(){
    std::cout << data;
}

int main()
{
    A<double> a;
    std::cout << a;
    return 0;
}

但是在編譯時會出現一個眾所周知的構建錯誤:
error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'

此錯誤通常意味着類型推導無法正常工作(不可扣除上下文)(參見為什么模板類型推導不起作用ostream左值錯誤

因此,我認為,目前,你應該找到解決這個問題的另一種方法,這樣我暫時想不到。

暫無
暫無

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

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