这是我的代码。这令人难以置信。
#include <iostream>
#include <sstream>
#include <set>
#include <cmath>
#include <cstdlib>
#include "list.h"
#include "stack.h"
#include <limits>
#define PI 3.1415926535897932384626433832795
class RPN : public Stack<float> {
public:
std::string sqrt(float n);
};
std::string RPN::sqrt(float n){
std::string x;
x = sqrt(3.0);
std::ostringstream ss;
ss << n;
return (ss.str());
}
是的,正在编译。 sqrt返回一个字符串。试图使用double或float会抛出一个奇怪的错误。谁能告诉我发生了什么事?我以前从未见过这个。有趣的是,我实际上是稍后转换为字符串,但我怀疑这会编译任何其他地方......
postfix.cpp: In member function ‘std::string RPN::sqrt(float)’:
postfix.cpp:161:13: error: cannot convert ‘std::string {aka std::basic_string<char>}’ to ‘float’ in assignment
编辑:首先发布了错误的编译错误。
edit2:第161行是n = sqrt(n); 我甚至尝试了双x = sqrt(n)和许多其他方法; 哦,当我在上面发布的方法中打印出后面的字符串时,我得到一个段错误(obv ..)
std::string RPN::sqrt(float n) {
n = sqrt(n);
std::ostringstream ss;
ss << n;
return (ss.str());
}
答案 0 :(得分:3)
让我们更仔细地看一下代码
std::string RPN::sqrt(float n){
std::string x; // temporary string variable
// calling sqrt with 3.0? What?
// This call actually would make this function be recursive
// (it would hide ::sqrt), making the assignment possible
// to compile (as sqrt returns a string)
// This also means that the function will
// eventually cause a stack overflow as there is no break case.
x = sqrt(3.0);
std::ostringstream ss; // temporary string stream
ss << n; // putting x in the string stream
// returning the string value of the string stream
// (i.e. converting x to a string)
return (ss.str());
}
换句话说,没有编译错误,但如果运行该代码,则会出现运行时错误。
编辑:
尝试n = ::sqrt(n)
(或n = std::sqrt(n)
,如果你#include <cmath>
)而不是n = sqrt(n)
,因为你只需要调用你自己定义的函数,因为你的函数会掩盖全球范围。
n = sqrt(n)
使您的函数递归,而不是编译。
答案 1 :(得分:3)
行x = sqrt(3.0);
正在调用返回字符串的RDN::sqrt()
方法。我想您正试图在cmath中调用sqrt()
函数。我建议将你的方法重命名为其他东西。或者,您也可以致电std::sqrt(3.0)