C++ 失踪'';前标识符
当我编译这个时,我得到了这些错误。我找不出错误。特别是为什么C++ 失踪'';前标识符,c++,templates,visual-c++,C++,Templates,Visual C++,当我编译这个时,我得到了这些错误。我找不出错误。特别是为什么是必需的,以及为什么已经定义了函数模板。我正在使用VisualStudio2010。这适用于turboc++,但我想知道为什么visualc++会出现这些错误 Error 1 error C2146: syntax error : missing ';' before identifier 'file' Error 4 error C2146: syntax error : missing ';' before
代码>是必需的,以及为什么已经定义了函数模板。我正在使用VisualStudio2010。这适用于turboc++,但我想知道为什么visualc++会出现这些错误
Error 1 error C2146: syntax error : missing ';' before identifier 'file'
Error 4 error C2146: syntax error : missing ';' before identifier 'file'
Error 10 error C2995: 'int FileOperations<T>::getNoOfElements(void)' : function template has already been defined
Error 9 error C2995: 'T FileOperations<T>::readFromFile(int)' : function template has already been defined
Error 8 error C2995: 'void FileOperations<T>::swriteToFile(T,int)' : function template has already been defined
Error 7 error C2995: 'void FileOperations<T>::writeToFile(T)' : function template has already been defined
Error 2 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Error 3 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Error 5 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Error 6 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
#ifndef FileOp_h
#define FileOp_h
#include <iostream>
#include <cstdlib>
#include <fstream>
template <class T>
class FileOperations
{
private:
fstream file;
public:
FileOperations(){};
FileOperations(const char* fileName){fileOpen(fileName);};
void fileOpen(const char* fileName){file.open(fileName,ios::in|ios::out|ios::ate|ios::binary);};
void writeToFile(T);
void swriteToFile(T,int);
T readFromFile(int);
int getNoOfElements();
~FileOperations(){file.close();};
};
#endif
template <class T>
void FileOperations<T>::writeToFile(T fileOb)
{
file.clear();
file.write((char*)&fileOb, sizeof(fileOb))<<flush;
}
template <class T>
void FileOperations<T>::swriteToFile(T fileOb,int seekTo)
{
file.clear();
file.seekp(seekTo,ios::beg);
file.write((char*)&fileOb, sizeof(fileOb))<<flush;
}
template <class T>
T FileOperations<T>::readFromFile(int seekTo)
{
T object;
file.seekg(seekTo,ios::beg);
file.read((char*)&object,sizeof(object));
file.clear();
return object;
}
template <class T>
int FileOperations<T>::getNoOfElements()
{
file.seekg(0,ios::end);
int size=file.tellg();
return size/sizeof(T);
}
错误1错误C2146:语法错误:缺少“;”在标识符“文件”之前
错误4错误C2146:语法错误:缺少“;”在标识符“文件”之前
错误10错误C2995:'int FileOperations::getNoOfElements(void)':函数模板已定义
错误9错误C2995:'T FileOperations::readFromFile(int)':函数模板已定义
错误8错误C2995:'void FileOperations::swriteToFile(T,int)':已定义函数模板
错误7错误C2995:“无效文件操作::writeToFile(T)”:已定义函数模板
错误2错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认int
错误3错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认int
错误5错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认int
错误6错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认int
#ifndef FileOp_h
#定义FileOp_h
#包括
#包括
#包括
模板
类文件操作
{
私人:
流文件;
公众:
FileOperations(){};
文件操作(constchar*fileName){fileOpen(fileName);};
void fileOpen(const char*fileName){file.open(fileName,ios::in | ios::out | ios::ate | ios::binary);};
无效写入文件(T);
void swriteToFile(T,int);
T readFromFile(int);
int getNoOfElements();
~FileOperations(){file.close();};
};
#恩迪夫
模板
void FileOperations::writeToFile(T fileOb)
{
file.clear();
file.write((char*)&fileOb,sizeof(fileOb))说std::fstream file;
而不是fstream file;
,因为fstream
是在标准命名空间std
中声明的,而不是在全局命名空间中声明的
在与FileOp.h
对应的.cpp
文件中,如果您不想在该文件的任何地方键入std::
,则可以选择在该.cpp
文件中使用名称空间std;
说(这基本上是一个品味的问题,以及您希望获得名称冲突的可能性有多大。使std::
非限定名称可见会增加名称与全局名称冲突的可能性)。但不要将这样一行放在标题中
由于您的代码似乎完全位于一个.h
文件中,因此您没有这样的选项。但是,如果需要,您可以在成员函数的本地使用名称空间std;
说,或者在成员函数的本地范围内声明单个名称作为别名,例如使用std::fstream;
此外,还需要将这些成员函数的定义(类模板的)放入如果不直接在类主体内,则在标题保护内。由于多次包含标题,因此会显示其他错误消息,但出现在标题保护外的成员函数定义将被错误地发送到翻译单元中多次,从而在编译时引发多个定义错误 我得到了第一个问题的答案。这是因为我没有使用名称空间。现在我想知道为什么它说函数模板已经定义。我如何解决这个问题这里不需要;
。FileOperations(){};
。您在很多地方都这样做了。感谢您的快速回复。我找到了答案。我现在使用了名称空间,它没有给出错误,但仍然给出错误10错误C2995:'int FileOperations::getNoOfElements(void)':函数模板已经定义错误9错误C2995:'T FileOperations::readFromFile(int)“:已定义函数模板错误8错误C2995:“void FileOperations::swriteToFile(T,int)“:函数模板已经定义错误。你能告诉我这是什么原因吗…?你能给我看一下上一期的跳线吗?如何将定义放入标题保护装置中。请在我的代码中指的是将其放入何处。无论如何,感谢到目前为止的帮助。我试图找到如何将其放入标题保护装置中。但我同意我还没有找到它。不管怎样,如果不可能的话,它是可以的。我会尝试一些如何找到它的方法。谢谢你的帮助…得到了,兄弟。我把所有的成员函数都放在了类中。现在我正在寻找另一种方法。有人请告诉我标题是什么guard@Gihan你应该问一下头球护卫first!页眉保护是指#ifndef
/#定义你放在开头的东西。()