2016-11-20 13 views
-3

この件に関するいくつかの記事がありますが、これは最も単純な例の1つですが、うまくいけば、それは勘定書と初期化に関するいくつかの事柄を明らかにするでしょう。は 'std :: ostream {aka std :: basic_ostream <char>}' lvalueを 'std :: basic_ostream <char> &&'にバインドできません。

だから、この作品:

class A { 
    public: 
    std::ostream& operator<< (std::ostream& os) { 
     return os; 
    } 
}; 

class B { 
    std::ostream& operator<< (std::ostream& os) { 
     A a(); //  <-- LOOK 
     std::cout << a; 
     return os; 
    } 
}; 

しかし、私は単純にA a()A aの場合:

class A { 
    public: 
    std::ostream& operator<< (std::ostream& os) { 
     return os; 
    } 
}; 

class B { 
    std::ostream& operator<< (std::ostream& os) { 
     A a; //  <-- LOOK 
     std::cout << a; 
     return os; 
    } 
}; 

それはスロー:

nvcc main.cpp util.cpp -o main -lcublas -std=c++11 
In file included from main.cpp:9:0: 
cout-test.hpp: In member function ‘std::ostream& B::operator<<(std::ostream&)’: 
cout-test.hpp:21:20: error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’ 
     std::cout << a; 
        ^
In file included from /usr/include/c++/4.8/iostream:39:0, 
       from main.cpp:5: 
/usr/include/c++/4.8/ostream:602:5: error: initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = A]’ 
    operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x) 
    ^
make: *** [main] Error 1 

私はA a Aを加えた場合、私は同じエラーを取得クラスメンバー:

class B { 
    A a; //  <-- LOOK 
    std::ostream& operator<< (std::ostream& os) { 
     std::cout << a; 
     return os; 
    } 
}; 

何が得られますか?

+0

'std :: cout << a'は***ではありません***は' operator << 'メンバ関数を呼び出します。そして、最初のコードがコンパイルされる唯一の理由は、それが[最も厄介な構文解析](https://en.wikipedia.org/wiki/Most_vexing_parse)だからです。 –

+0

お知りになりたい!もう少し説明していただけますか? – ethanabrooks

答えて

1

最初のケース

A a(); 

は、オブジェクトを作成しません。それは関数を宣言します。この解析の問題はThe Most Vexing Parseとして知られています。

A a(); 
    std::cout << a; 

作品がaので、この場合にboolに変換されます。その理由はWhy does pointer to int convert to void* but pointer to function convert to bool?を参照してください。

後者の場合

A a; 
    std::cout << a; 

があるため、あなたがoperator<<機能を定義した方法では動作しません。

A a; 
    std::cout << a; 

理由を理解することはmy answer to another SO postを参照してください:あなたはoperator<<機能を使用するために、非メンバ関数にする必要があり

A a; 
    a << std::cout; 

を使用する必要があります。

関連する問題