C++ 名称后跟::必须是类或命名空间名称

C++ 名称后跟::必须是类或命名空间名称,c++,function,class,C++,Function,Class,我已经在这里和互联网上的其他地方阅读了许多关于这个主题的文章,并开发了符合我所学内容的代码。不幸的是,这似乎并不能解决这个问题。以下是拼图的各个部分: 定义的类: class FileData { private: char* filename; public: FileData(); void CloseFile(std::fstream file); int DeleteFile(char* fname); int FileExist(char* f

我已经在这里和互联网上的其他地方阅读了许多关于这个主题的文章,并开发了符合我所学内容的代码。不幸的是,这似乎并不能解决这个问题。以下是拼图的各个部分:

定义的类:

class FileData {
private:
    char* filename;

public:
    FileData();
    void CloseFile(std::fstream file);
    int DeleteFile(char* fname);
    int FileExist(char* fname);
    int OpenDestFile(std::fstream file, char* fname);
    int OpenListFile(std::fstream file, char* fname);
    int OpenSourceFile(std::fstream file, char* fname);
    int ReadBuffer(std::fstream file, char* Buffer);
    int ReadListFile(std::fstream file);
    int WipeFile(char* fname);
    int WriteBuffer(std::fstream file, char* Buffer);
};
构造函数代码:

FileData::FileData() : filename(nullptr) {}
我遇到问题的已定义函数(与类的哪个函数无关…它们都有相同的错误):

作为一个全局变量,我将FileRec声明为一类FileData:

FileData FileRec;
以下是生成错误的实际函数调用:

if ((ccode = FileRec::OpenListFile(&ListFile, fspec3)) != 0) {
   // ....
}

任何帮助都将不胜感激。谢谢。

您已将
OpenListFile()
声明为实例方法,而不是静态方法
FileRec
FileData
类的
实例。您需要使用
操作符来访问对象实例的成员,例如:

FileData FileRec;
std::fstream列表文件;
...
如果((ccode=FileRec.OpenListFile(ListFile,fspec3))!=0){
// ...
}
否则,对于不需要访问
FileData
类的任何数据成员的任何方法,请使用
static
,然后在使用
时使用类名而不是实例名,例如:

类文件数据{
公众:
静态void CloseFile(std::fstream文件);
静态int-DeleteFile(char*fname);
静态int FileExist(char*fname);
静态int-OpenDestFile(std::fstream文件,char*fname);
静态int-OpenListFile(std::fstream文件,char*fname);
静态int-OpenSourceFile(std::fstream文件,char*fname);
静态int ReadBuffer(std::fstream文件,char*Buffer);
静态int ReadListFile(std::fstream文件);
静态文件(char*fname);
静态int WriteBuffer(std::fstream文件,char*Buffer);
};
...
int FileData::OpenListFile(std::fstream文件,char*fname){
open(fname,std::fstream::in);
返回文件.bad()?-1:0;
}
...
std::fstream列表文件;
如果((ccode=FileData::OpenListFile(ListFile,fspec3))!=0){
// ....
}

也就是说,请注意,不能通过值传递
std::fstream
,因为
std::fstream
不可复制。您需要通过引用或通过指针传递它:

。。。
int OpenListFile(std::fstream&file,char*fname);
...
。。。
int OpenListFile(std::fstream*文件,char*fname);
...

OpenListFile
不将指针作为第一个参数。这里应该有几个错误。除非这些是
static
方法,否则将它们称为
X::Y()
是没有意义的。在一个实例中,它调用了一个实例:代码< >代码> >代码> >代码>或>代码> x> >()。(代码)如果你有一个指针。注意:在C++中,使用<代码> STD::String < /C>是个好主意,而且使用<代码> char */COD>保留数据是个坏主意。内存管理并不容易,甚至不好玩。除非你
strdup()
你的参数你不能保证你能保留它们,如果你复制了,你必须在析构函数中释放,它没有显示出来,所以这可能是一个漏洞。提示:试着为你的函数和变量名选择一个命名约定。您使用的是
缓冲区(大写)和
fname
(小写)。许多C++代码基础<代码> CopyAlgys<代码>被保留为类,其中所有的东西都是<代码> LoeRealSys< /Cuff>样式。我在类中的每个函数定义(构造函数除外)中添加了“static”,我得到了相同的结果?是的,我也修复了函数调用中的“&ListFile”问题(简单的打字错误)。至于命名约定,这是一个旧的“C”程序,我正在转换为C++(同时学习)。值得注意的是,一个“类”从未例证,它只是满了“代码>静态< /代码>方法根本不是一个类。”它们可以改为
名称空间
中的一组独立函数。@RemyLebeau感谢您的准确回答。今天早些时候,我找到了通过引用或指针传递fstream的答案。在C年前,我已经咬牙了,我当然是在编程多年后,玩追赶学习C++,这是事物工作的巨大差异。谢谢
if ((ccode = FileRec::OpenListFile(&ListFile, fspec3)) != 0) {
   // ....
}