2012-07-17 26 views
2

我試圖在C++中的類上重載< <運算符。每當我在輸出流中插入一個普通的字符串,比如「」,我就會得到我無法理解的編譯錯誤。我之前做過這個,沒有問題,所以我很困惑。插入字符串時出錯<<重載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 
+2

由於某種原因,它看起來像是'std :: ostream&operator <<(std :: ostream&,const char * )'運算符重載無法找到,所以它試圖使用與您定義的'operator <<'函數相同的 - 因此它抱怨'const char *'不能被轉換爲'Variable'。你可以添加你的'#include's到你的問題嗎? – cdhowie 2012-07-17 00:11:51

+1

甚至更​​好,構建一個[最小測試用例](http://sscce.org)? – 2012-07-17 00:12:12

+1

.....我忘了包括。但是,這對我來說很奇怪。因爲它每當我沒有添加一個字符串到輸出流時就起作用了。我原以爲編譯器根本找不到ostream。 – wright8191 2012-07-17 00:28:35

回答

4

Derp。我沒有包含iostream。然而,這對我來說沒有什麼意義......因爲它每當我沒有添加一個字符串到ostream時就起作用了。我會認爲編譯器根本就不能找到ostream,並且會抱怨

+0

如果你接受你自己的答案,這個問題不會出現沒有回答! – Hurkyl 2012-07-17 00:52:51

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

它的一個例子,如何聲明和實現運營商< <

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