error: cannot bind ‘std::ostream in implementation file
error: cannot bind ‘std::ostream in implementation file
首先:我已经尝试阅读和修改我的代码,基于不少于 7 个其他类似问题。充其量,其他选项会引发大量错误。使用我当前的代码,我只有一个错误。
将它放在 class 中并使用 "friend" 不起作用,使用 ostream& operator<< (ostream &out, const Fraction &rhs) 会产生更多错误。
令人沮丧的是,此代码在 c9.io 中有效,但在 Netbeans 中无效。
在我的 main.cpp:
#include <iostream>
#include "fraction.h"
using namespace std;
int main() {
Fraction f(3, 4);
cout << f;
return 0;
}
在fraction.h中:
#ifndef FRACTION_H
#define FRACTION_H
class Fraction{
public:
//constructor defs
//accessors
//modifiers/mutators
void setNumer(int newNum);
void setDenom(int newDenom);
void reduce();
private:
//instance variables
int numer;
int denom;
//helper functions
int gcd(int a, int b);
};
#endif /* FRACTION_H */
在 fraction.cpp 中:
#include "fraction.h"
#include <cmath>
#include <iostream>
using namespace std;
//code for constructors
//accessors
int Fraction::getNumer(){
return numer;
}
int Fraction::getDenom(){
return denom;
}
//modifiers/mutators
//other operator definitions
ostream& operator<< (ostream &out, Fraction &rhs){
if(rhs.getNumer() == 0){
out << 0;
} else if(rhs.getNumer() == rhs.getDenom()){
out << 1;
} else {
rhs.reduce();
out << rhs.getNumer() << "/" << rhs.getDenom();
}
}
输出为:
g++ -c -g -std=c++11 -MMD -MP -MF "build/Debug/GNU-Linux/main.o.d" -o build/Debug/GNU-Linux/main.o main.cpp
main.cpp: In function ‘int main()’:
main.cpp:6:13: error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’
cout << f;
^
In file included from /usr/include/c++/4.8/iostream:39:0,
from main.cpp:1:
/usr/include/c++/4.8/ostream:602:5: error: initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = Fraction]’
operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x)
^
main.cpp
中 Fraction.cpp
中定义的 operator<<
函数一无所知 因此,行
cout << f;
是个问题。
在.h文件中添加函数的声明。
#ifndef FRACTION_H
#define FRACTION_H
#include <iostream>
class Fraction{
public:
//constructor defs
//accessors
//modifiers/mutators
void setNumer(int newNum);
void setDenom(int newDenom);
void reduce();
private:
//instance variables
int numer;
int denom;
//helper functions
int gcd(int a, int b);
};
std::ostream& operator<< (std::ostream &out, Fraction const& rhs);
// ^^^^ Using const&, not just Fraction&
#endif /* FRACTION
所以答案部分是@r-sahu 所说的:
我必须将 getNumer()
和 getDenom()
设置为 const
成员函数,但我只能通过在函数定义中不使用 const&
来消除错误。
好:
std::ostream& operator<< (std::ostream &out, Fraction rhs);
不好:
std::ostream& operator<< (std::ostream &out, Fraction const& rhs);
现在可以编译和运行了。关于为什么使成员函数 const
但不将分数传递为 const
使其起作用的任何见解?无意中发现了这个解决方案,没看懂
首先:我已经尝试阅读和修改我的代码,基于不少于 7 个其他类似问题。充其量,其他选项会引发大量错误。使用我当前的代码,我只有一个错误。
将它放在 class 中并使用 "friend" 不起作用,使用 ostream& operator<< (ostream &out, const Fraction &rhs) 会产生更多错误。 令人沮丧的是,此代码在 c9.io 中有效,但在 Netbeans 中无效。
在我的 main.cpp:
#include <iostream>
#include "fraction.h"
using namespace std;
int main() {
Fraction f(3, 4);
cout << f;
return 0;
}
在fraction.h中:
#ifndef FRACTION_H
#define FRACTION_H
class Fraction{
public:
//constructor defs
//accessors
//modifiers/mutators
void setNumer(int newNum);
void setDenom(int newDenom);
void reduce();
private:
//instance variables
int numer;
int denom;
//helper functions
int gcd(int a, int b);
};
#endif /* FRACTION_H */
在 fraction.cpp 中:
#include "fraction.h"
#include <cmath>
#include <iostream>
using namespace std;
//code for constructors
//accessors
int Fraction::getNumer(){
return numer;
}
int Fraction::getDenom(){
return denom;
}
//modifiers/mutators
//other operator definitions
ostream& operator<< (ostream &out, Fraction &rhs){
if(rhs.getNumer() == 0){
out << 0;
} else if(rhs.getNumer() == rhs.getDenom()){
out << 1;
} else {
rhs.reduce();
out << rhs.getNumer() << "/" << rhs.getDenom();
}
}
输出为:
g++ -c -g -std=c++11 -MMD -MP -MF "build/Debug/GNU-Linux/main.o.d" -o build/Debug/GNU-Linux/main.o main.cpp
main.cpp: In function ‘int main()’:
main.cpp:6:13: error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’
cout << f;
^
In file included from /usr/include/c++/4.8/iostream:39:0,
from main.cpp:1:
/usr/include/c++/4.8/ostream:602:5: error: initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = Fraction]’
operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x)
^
main.cpp
中 Fraction.cpp
中定义的 operator<<
函数一无所知 因此,行
cout << f;
是个问题。
在.h文件中添加函数的声明。
#ifndef FRACTION_H
#define FRACTION_H
#include <iostream>
class Fraction{
public:
//constructor defs
//accessors
//modifiers/mutators
void setNumer(int newNum);
void setDenom(int newDenom);
void reduce();
private:
//instance variables
int numer;
int denom;
//helper functions
int gcd(int a, int b);
};
std::ostream& operator<< (std::ostream &out, Fraction const& rhs);
// ^^^^ Using const&, not just Fraction&
#endif /* FRACTION
所以答案部分是@r-sahu 所说的:
我必须将 getNumer()
和 getDenom()
设置为 const
成员函数,但我只能通过在函数定义中不使用 const&
来消除错误。
好:
std::ostream& operator<< (std::ostream &out, Fraction rhs);
不好:
std::ostream& operator<< (std::ostream &out, Fraction const& rhs);
现在可以编译和运行了。关于为什么使成员函数 const
但不将分数传递为 const
使其起作用的任何见解?无意中发现了这个解决方案,没看懂