无法将'std :: ostream {aka std :: basic_ostream <char>}'左值绑定到'std :: basic_ostream <char>&amp;&amp;'</char> </char>

时间:2014-09-11 14:27:14

标签: c++ c++11

StackOverflow上有很多关于这个标题的问题但没有人对我有所帮助,我也不太了解发生了什么。

我正在尝试创建一个生成随机单词的类。首先,我试图将所有元音和辅音放在两个不同的static vector中;但是在测试课程时我得到了这个错误:

cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'

我真的不明白这个错误。 ostream右值?我从来没有见过这个,我想不出任何有意义的情况。

到目前为止,这是我的班级:

class RandomWordGenerator {
    public:
        RandomWordGenerator() {
            vowels.push_back(Letter('A'));
        }
        static Word generate() {
            std::cout << vowels.front() << std::endl; // the error pops here
            Word w(std::string("test"));
            return w;
        }
    private:
        static std::vector<Letter> vowels;
        static std::vector<Letter> consonants;
};

std::ostream& operator <<(std::ostream& os, Letter& l) {
    return os << l.inner(); // a std::string
}

为什么会这样?我该如何解决?

1 个答案:

答案 0 :(得分:2)

首先:声明函数接受const Letter&,然后定义你的成员静态变量,并在使用之前转发声明或定义运算符

std::ostream& operator <<(std::ostream& os, const Letter& l);

class RandomWordGenerator {
    public:
        RandomWordGenerator() {
            vowels.push_back(Letter('A'));
        }
        static Word generate() {
            std::cout << vowels.front() << std::endl; // the error pops here
            Word w(std::string("test"));
            return w;
        }
    public:
        static std::vector<Letter> vowels;
        static std::vector<Letter> consonants;
};

std::vector<Letter> RandomWordGenerator::vowels;

std::ostream& operator <<(std::ostream& os, const Letter& l) {
    return os << l.inner(); // a std::string
}

在使用它们之前声明或定义运算符和函数既是一种很好的编程实践,也是强制类型安全的强制要求:编译器需要知道它与整个签名一起处理的类型。有关更全面的解释,我建议您阅读以下文章:https://stackoverflow.com/a/4757718/1938163

请注意,您也可以将该函数声明为友元函数,但这里有一个问题:friend declaration not forward declaring

std::ostream& operator <<(std::ostream& os, const Letter& l) {
    return os << l.inner(); // a std::string
}

class RandomWordGenerator {
    public:
        RandomWordGenerator() {
            vowels.push_back(Letter('A'));
        }

        friend std::ostream& operator <<(std::ostream& os, const Letter& l);

        static Word generate() {
            std::cout << vowels.front() << std::endl; // the error pops here
            Word w(std::string("test"));
            return w;
        }


    public:
        static std::vector<Letter> vowels;
        static std::vector<Letter> consonants;
};

std::vector<Letter> RandomWordGenerator::vowels;