找不到重载运算符<<

时间:2017-07-22 17:25:24

标签: c++ c++11 operator-overloading

我有一个绘制函数,它返回向量< >

vector< vector<char> > draw(char penChar, char fillChar) const{
        const int breadth = this->height;
        const int length = this->width;
        vector< vector<char> > temp(breadth, vector<char>(length));
        for (int x = 0; x <= height - 1; x++) {
            for (int y = 0; y <= width - 1; y++) {
                temp[0].push_back(penChar);
            }
        }

        return temp;
    }

我重载了运算符&lt;&lt;像这样

friend ostream& operator<<(ostream& os,  const vector< vector<char> >& grid) {
        for (const vector<char>& vec : grid) {
            for (const char& ch : vec) {
                os << ch;
            }
            os << "\n";
        }
        return os;
    }

但是当我运行cout << rect.draw('2', 'w') << endl;时,我收到以下错误。

entererror: no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘std::vector<std::vector<char> >’)
cout << rect.draw('2', 'w') << endl;

有人能说出为什么编译器找不到这个方法吗? 我还有另一个运营商&lt;

friend ostream& operator<<(ostream& os, const Shape& obj) {
        //Some code
  return os;
    }

但这似乎工作正常。

1 个答案:

答案 0 :(得分:2)

你应该简单地将函数lea放在课堂之外而没有朋友,就像这样:

ostream& operator<<(ostream& os,  const vector< vector<char> >& grid)

因为在你定义的函数中没有(在这个例子中)Foo类的变量,所以不能使用ADL(依赖于参数的查找),因此如果你定义了类编译器中的函数,则无法找到它。