我的“记录”构造函数如下所示:
#include "Record.h" //both these headers #include <iostream>
#include "String.h"
Record :: Record(std::ifstream& is)
{
std :: istream & iss = static_cast<std::istream &>(is);
iss >> ID >> medium >> rating;
getline(iss, title);
if (!iss.good())
throw Record_exception(invalid_data);
}
其中ID是int,medium和title是用户定义的类型String(不是标准字符串),运算符&gt;&gt; ,getline和运算符&lt;&lt;在istream上定义如下
#include "String.h"
ostream& operator << (ostream& os, const String & s)
{
int str_length = s.size();
for (int i = 0; i < str_length ; i++)
os << s[i];
return os;
}
istream& operator >> (istream& is, String& str)
{
char input;
bool string_end = false;
int length = 0;
str.clear();
while (!string_end){
is.get(input);
if (!isspace(input) && is){
length++;
str +=input;
}else if (length || !is)
string_end = true;
}
return is;
}
istream& getline(std::istream& is, String& str)
{
char input;
bool string_end = false;
int length = 0;
str.clear();
while (!string_end){
is.get(input);
if (!isspace(input) && is){
length++;
str +=input;
}else if ((length && is.peek() == '\0') || !is)
string_end = true;
}
return is;
}
我将ifstream静态发送到istream,因为我意识到编译器不接受我的“getline”和运算符&lt;&lt; for String和operator&lt;&lt;对于带有ifstream的字符串。我仍然不知道这是否是正确的方法
我的编译器错误现在包括:
“Record.cpp:在构造函数中'Record :: Record(std :: ifstream&amp;)': Record.cpp:26:错误:类型无效static_cast 输入'std :: basic_ifstream&gt;' “的std :: istream的&安培;”
我在red_hat linux机器上使用标志“g ++ -c -pedantic -Wall -fno-elide-constructors”进行编译
答案 0 :(得分:0)
在您的情况下,我认为您必须了解ifstreams实现istream接口。您的Record构造函数实际上不需要ifstream。里面的所有代码都只使用istream的公共接口。所以你只需要让你的Record构造函数采用istream&amp; (不是ifstream&amp;)。这也将使您的Record类更加通用,因为您可以将它与各种istream一起使用,而不仅仅是文件输入流。
但是,您的String类重载看起来很好。我怀疑从你试图使用static_cast fstream到istream的方式(这是一个upcast并且永远不应该被明确要求而且也不应该被完成),你试图解决的原始问题是你没有所有相关领域都包含适当的标题。确保在必要时包含istream,ostream和fstream,而不仅仅是iosfwd或iostream。如果编译器在尝试将fstream引用传递给期望istream&amp;的函数时出错,那么肯定是错误的,最可能的解释是前向声明和缺失包含。