我有以下类定义,用C ++编写,驻留在它自己的头文件中(ManageFeed.h
)
#include <string>
#include <fstream>
#include <iostream>
#include <cstring>
class ManageFeed
{
bool get_feed();
void format_feed();
bool refresh_feed();
int find_start_of_string(string tag, ifstream& rssfile);
public:
void display_feed_list();
void display_feed_item();
ManageFeed();
};
当我尝试编译此代码时,出现以下错误
custom-headers/ManageFeed.h:22: error: ‘string’ has not been declared
custom-headers/ManageFeed.h:22: error: ‘ifstream’ has not been declared
如果我从int find_start_of_string()
函数中删除参数,我发现我可以成功编译代码而没有任何错误,但是如果要将数据传递给函数,那么这不是所需的参数吗?如果我尝试从main()
调用此函数,则会收到以下错误
reader.cpp:6: error: prototype for ‘void ManageFeed::find_start_of_string(std::string, std::ifstream&)’ does not match any in class ‘ManageFeed’
因此显然需要它们才能使用该功能。我正在使用的教科书在他们自己的头文件中有类定义的例子,参数存在,但我的代码结构似乎没有其他差异,也没有给出为什么书代码工作和我的没有任何解释“T。
问题:定义中不需要的参数(ManageFeed.cpp
中的函数定义是否指定了参数)还是我在这里做错了?
如果有人有兴趣,这是我的申请文件
#include "custom-headers/ManageFeed.h"
using namespace std;
ifstream rssfile;
const string tag;
void ManageFeed::find_start_of_string(string tag, ifstream& rssfile);
int main()
{
ManageFeed manage_example;
rssfile.open("rss.xml");
manage_example.find_start_of_string(tag, rssfile);
return 0;
}
和ManageFeed的实施文件
#include "ManageFeed.h"
#include <iostream>
#include <string>
#include <cstring>
ManageFeed::ManageFeed()
{
}
/*
A function that will get the location of the RSS file from the user
*/
bool ManageFeed::get_feed()
{
cout << "Please specify the location of the feed: " << endl << endl;
cin >> feed_source;
return true;
}
void ManageFeed::store_feed()
{
ifstream source_feed;
source_feed.open(feed_source);
ifstream local_feed;
local_feed.open
(
"/../File System/Feed Source Files/Example Feed/Example Feed.xml"
);
local_feed << source_feed;
}
int ManageFeed::find_start_of_string(string tag, ifstream& rssfile)
{
bool return_value = false;
string line;
size_t found;
do
{
getline(rssfile, line, '\n');
found = line.find(tag);
if (found != string::npos)
{
return_value = true;
return found;
}
} while (!return_value && !rssfile.eof());
if (!return_value)
{
}
}
答案 0 :(得分:2)
John有正确的解决方案。这是推理。
string和ifstream都位于名为std的名称空间中。当你说字符串时,你告诉编译器查看全局命名空间并找到一个名为string的标记。哪有这回事。你必须告诉编译器在哪里找到字符串。
为此,您可以使用std :: string和std :: ifstream作为前缀,也可以在头文件的顶部添加using namesapce std;
。
仔细观察一下,你的.cpp文件中有using指令,但是在包含标题之后你就把它放了。这意味着编译器在没有命名空间的情况下解析头,然后用它解析文件的其余部分。如果你只是移动标题include上面的using指令,它也会解决你的问题。但请注意,使用标头的任何其他内容也需要执行相同的操作。因此,以这种方式启动.cpp文件:
using namespace std;
#include "custom-headers/ManageFeed.h"
答案 1 :(得分:1)
变化:
int find_start_of_string(string tag, ifstream& rssfile);
为:
int find_start_of_string(std::string tag, std::ifstream& rssfile);
除此之外:为什么今天有这么多问题呢?