2013-11-02 82 views
0
istream &operator>>(istream &in, iString &a) { 
     string name; 
     in>>name; 
     iString b(name); 
     delete a.chars; 
     a=b; 
     return in; 
} 
ostream &operator<<(ostream &out, const iString &a) { 
     out<<a.chars<<endl; 
     return out; 
} 

这些是我的结构写的运营商:运营商<< , >>重载失败特定类

error: no match for ‘operator>>’ in ‘std::cin >> * a[(((int)which) + -0x00000000000000061)]’ 
/usr/include/c++/4.4/istream:119: note: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>& (*)(std::basic_istream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>] 
/usr/include/c++/4.4/istream:123: note:     std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>] 
/usr/include/c++/4.4/istream:130: note:     std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>] 
/usr/include/c++/4.4/istream:166: note:     std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(bool&) [with _CharT = char, _Traits = std::char_traits<char>] 
/usr/include/c++/4.4/istream:170: note:     std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(short int&) [with _CharT = char, _Traits = std::char_traits<char>] 
/usr/include/c++/4.4/istream:173: note:     std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(short unsigned int&) [with _CharT = char, _Traits = std::char_traits<char>] 
/usr/include/c++/4.4/istream:177: note:     std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(int&) [with _CharT = char, _Traits = std::char_traits<char>] 
/usr/include/c++/4.4/istream:180: note:     std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(unsigned int&) [with _CharT = char, _Traits = std::char_traits<char> 

部分:我得到的错误

struct iString{ 
    char * chars; 
    unsigned int length; 
    unsigned int capacity; 

    iString(); 
    iString(const char *); 
    iString(const iString&); 
    ~iString(); 

    iString &operator=(const iString&); 
    }; 

// Add other declarations here: 
iString operator+(const iString &a, const iString &b); 
iString operator*(const iString &a, unsigned int scalar); 
iString operator*(unsigned int scalar, const iString &a); 
ostream &operator<<(ostream &out, const iString &b); 
istream &operator>>(istream &in, iString &b); 

部分我使用我的客户端模块(主)中的结构的方式:

switch(c) { 
     case 'r': 
     cin >> which; // Reads a, b, c, or d 
     a[which-'a'] = new iString; 
     cin >> *(a[which-'a']); 
     break; 
     case 'w': 
     cin >> which; // Reads a, b, c, or d 
     cout << *(a[which-'a']) << endl; 
     break; 
     case 'n': 
     cin >> which >> temp; 
     a[which-'a'] = new iString(temp.c_str()); 
     break; 
     case 'i': 
     cin >> op1 >> op2; 
     a[op1-'a'] = 

注:字段字符指的是矢量堆上分配

客户端模块中的变量定义(主):

int main() { 
    bool done = false; 
    string temp; 
    iString *a[4]; 
    while(!done) { 
    char c; 
    char which; 
    char op1; 
    char op2; 
    int int_op; 
    cerr << "Command?" << endl; // Valid commands: r [a-d] string 
           //     wa, wb, wc, wd, q 
           //     s[a-d][a-d][a-d] 
           //     t [a-d] [a-d] string 
           //     m [a-d] int [a-d] 
           //     p [a-d] [a-d] int 
           //     n [a-d] string 
           //     i [a-d] [a-d] 
           //     = [a-d] [a-d] 
           //     f [a-d] 
           //     e [a-d] 
           //     l [a-d] 
    cin >> c; // Reads r, p, m, s, w, n, i, e, f, q 
    if (cin.eof()) break; 

我用这个定义为赋值运算符:

iString& iString::operator=(const iString &b) { 
     chars=new char[strlen(b.chars)+1]; 
     strcpy(chars, b.chars); 
     length=capacity=b.length; 
     return *this; 
} 

更改为删除[] ...;用于删除阵列,并把它包含的类定义文件中的“使用命名空间std”我得到了新的错误正确的语法:

istring.h:21: error: expected constructor, destructor, or type conversion before ‘&’ token 
istring.h:22: error: expected constructor, destructor, or type conversion before ‘&’ token 
istring.cc: In function ‘std::istream& operator>>(std::istream&, iString&)’: 
istring.cc:59: error: no matching function for call to ‘iString::iString(std::string&)’ 
istring.cc:19: note: candidates are: iString::iString(const iString&) 
istring.cc:11: note:     iString::iString(const char*) 
istring.cc:7: note:     iString::iString() 
istring.h:21: error: expected constructor, destructor, or type conversion before ‘&’ token 
istring.h:22: error: expected constructor, destructor, or type conversion before ‘&’ token 
+0

添加你的变量声明,我猜''a'是'iString ** a'或类似的东西。 –

+0

在这里你去先生! –

+0

'删除a.chars; a = b;'如果有必要,应在'iString' *的赋值运算符中完成'delete'。 – dyp

回答

0

您: 在文件从istring.cc:3包括应该试试;

cout << a[which-'a'] << endl; 
cin >> a[which-'a']; 
+0

我明白你的意思,但不应该将一个iString对象的引用传递给<<而不是一个指针?我知道引用是指针,但它们仍然是一种特殊类型的指针:意思是键入* cont p; –

0

这是你的问题:您尝试调用构造函数的参数name是一个std::string。您声明了三个构造函数,但是没有一个使用std::string

string name; 
    in>>name; 
    iString b(name); 

如果您尝试了以下操作(如您在代码中使用的其他操作),该怎么办?

iString b(name.c_str()); // use iString(const char *); 

另外,如果你明确指出你想要一个整数来索引你的指针数组呢?

cin >> which; // Reads a, b, c, or d 
    int index = which - 'a';   // explicitly create an int 
    assert(0 <= index && index < 4); // should probably do some checking of input 
    a[index] = new iString; 
    cin >> *(a[index]); 
    break; 

它会使你的代码更清晰,并避免在你的编译器错误中显示偏移量。