在定义类的成员函数时包含参数会返回错误

时间:2010-11-11 22:22:01

标签: c++ class

我有以下类定义,用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)
{
}
}

2 个答案:

答案 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);

除此之外:为什么今天有这么多问题呢?