-1

我有一个 util.h/.cpp ,其中 istreams 的 operator>> 重载,看起来像

// util.h
//
// ... lots of stuff ...

std::istream& operator>>(std::istream& is, const char *str);
std::istream& operator>>(std::istream& is, char *str);

// util.cpp
//
// lots of stuff again
//! a global operator to scan (parse) strings from a stream
std::istream& operator>>(std::istream& is, const char *str){
  parse(is, str); return is;
}
//! the same global operator for non-const string
std::istream& operator>>(std::istream& is, char *str){
  parse(is, (const char*)str); return is;
}

在其他一些文件中,我使用这样的构造:

std::istream file;
char *x, *y;

// opening and allocating space for strings comes here

file >> "[ " >> x >> "," >> y >> " ]";

这与 gcc/g++ (v. 4.6.3) 配合得很好,但现在我想使用 clang (v 3.0) 并得到错误说明,找不到适当的运算符重载:

clang -ferror-limit=1 -g -Wall -fPIC -o ors.o -c ors.cpp
ors.cpp:189:21: error: invalid operands to binary expression ('std::istream' (aka 'basic_istream<char>') and 'const char [2]')
   file >> "[ " >> x >> "," >> y >> " ]";
   ~~~~ ^ ~~~~
/usr/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.6.3/../../../../include/c++/4.6.3/istream:121:7: note: candidate function
  not viable: no known conversion from 'const char [2]' to '__istream_type &(*)(__istream_type &)' for 1st argument;
  operator>>(__istream_type& (*__pf)(__istream_type&))
 [[ lots of other possible candidates from the stl ]]

为什么clang找不到合适的声明,而gcc没有问题。我怎样才能解决这个问题?

4

1 回答 1

2

你确定你在你做'file >>“[”'的文件中包含util.h吗?

如果没有更多细节,很难说出您遇到了什么问题。对我来说,clang 使用以下完整程序编译得很好:

#include <iostream>
#include <sstream>

std::istream& operator>>(std::istream& is, const char *str);
std::istream& operator>>(std::istream& is, char *str);

int main() {
    std::stringstream file("tmp");
    char *x, *y;

    // opening and allocating space for strings comes here

    file >> "[ " >> x >> "," >> y >> " ]";
}


// util.cpp
//
// lots of stuff again

void parse(std::istream& is, const char *str) {}

//! a global operator to scan (parse) strings from a stream
std::istream& operator>>(std::istream& is, const char *str){
    parse(is, str); return is;
}
//! the same global operator for non-const string
std::istream& operator>>(std::istream& is, char *str){
    parse(is, (const char*)str); return is;
}

尽管您应该考虑以其他方式执行此操作,因为提供您自己的重载运算符来覆盖标准运算符并不是一个好习惯。查找规则是晦涩难懂的,滥用它们的代码可能难以理解和维护。

于 2012-03-13T03:43:35.307 回答