2

C++ のクラスで << 演算子をオーバーロードしようとしています。" " などの通常の文字列を出力ストリームに挿入するたびに、意味のわからないコンパイル エラーが発生します。私は以前に一度これを問題なく行ったことがあるので、非常に混乱しています。

friend std::ostream& operator<<(std::ostream& out, Variable v);

std::ostream& operator<<(std::ostream& out, Variable v) {
    out << v.type;
    out << " ";
    out << v.name;
    return out;
}

出力は次のとおりです。

src/Variable.cpp: In function 'std::ostream& operator<<(std::ostream&, Variable)':
src/Variable.cpp:35:9: error: no match for 'operator<<' in 'out << " "'
src/Variable.cpp:35:9: note: candidates are:
src/Variable.cpp:33:15: note: std::ostream& operator<<(std::ostream&, Variable)
src/Variable.cpp:33:15: note:   no known conversion for argument 2 from 'const char [2]' to 'Variable'
In file included from /usr/local/Cellar/gcc/4.7.0/gcc/lib/gcc/x86_64-apple-darwin10.8.0/4.7.0/../../../../include/c++/4.7.0/string:54:0,
             from src/../inc/Variable.h:4,
             from src/Variable.cpp:1:
/usr/local/Cellar/gcc/4.7.0/gcc/lib/gcc/x86_64-apple-darwin10.8.0/4.7.0/../../../../include/c++/4.7.0/bits/basic_string.h:2750:5: note: template<class _CharT, class _Traits, class _Alloc> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const std::basic_string<_CharT, _Traits, _Alloc>&)
/usr/local/Cellar/gcc/4.7.0/gcc/lib/gcc/x86_64-apple-darwin10.8.0/4.7.0/../../../../include/c++/4.7.0/bits/basic_string.h:2750:5: note:   template argument deduction/substitution failed:
src/Variable.cpp:35:9: note:   mismatched types 'const std::basic_string<_CharT, _Traits, _Alloc>' and 'const char [2]'
make: *** [bin/Variable.o] Error 1
4

3 に答える 3

5

ダープ。iostream は含めませんでした。ただし、これは私にはあまり意味がありません... ostream に文字列を追加していないときはいつでも機能したためです。コンパイラは ostream をまったく見つけることができず、それについて不平を言うと思います

于 2012-07-17T00:38:51.703 に答える
1

あなたのソリューションをコードで示します

#include <iostream>
#include <string>

/* our custom class */
class Developer 
{
public:
    Developer(const std::string& name, int age) :
     m_name(name), 
     m_age(age) 
    {}

    const std::string& name() const { return m_name; }
    int age() const { return m_age; }

private:
    std::string m_name;
    int m_age;
};

/* overloaded operator<< for output of custom class Developer */
std::ostream& operator<< (std::ostream& stream, const Developer& developer) 
{
    stream << "Developer name:\t" << developer.name() << std::endl;
    stream << "Developer age:\t"  << developer.age()  << std::endl;
    return stream;
}

/* test custom operator<< for class Developer */
int main(int argc, const char** argv) 
{    
    Developer max("Maxim", 23);
    std::cout << max;

    return 0;   
}
于 2012-07-17T00:33:26.350 に答える
1
#include <utility>
#include <iostream>

template <typename T1, typename T2>
std::ostream& operator<< (std::ostream& out, const std::pair<T1, T2>& v)
{
    out << v.first;
    out << " ";
    out << v.second << std::endl;
    return out;
}

int main()
{
    std::pair<int, int> a = std::make_pair(12, 124);
    std::cout << a << std::endl;
    return EXIT_SUCCESS;
}

演算子 << を宣言して実装する方法の例

于 2012-07-17T00:13:59.670 に答える