运算符 << ,>>特定类的重载失败
operators << , >> overloading fail for a particular class
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;
}
这些是我为结构编写的运算符:
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);
我得到的部分错误:
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>
我在客户端模块(主)中使用结构的部分方式:
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.cc:3 包含的文件中:
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
你应该试试;
cout << a[which-'a'] << endl;
cin >> a[which-'a'];
这是
你的问题:您正在尝试使用参数调用构造函数,该参数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;
这将使您的代码更清晰,并避免在编译器错误中显示该偏移量。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中