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
}
为什么会这样?我该如何解决?
答案 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;