失踪 ';'在标识符之前

时间:2011-10-15 14:36:27

标签: c++ templates visual-c++

编译时遇到这些错误。我找不到错误。特别是为什么需要;以及为什么已经定义了函数模板。我正在使用Visual Studio 2010.这适用于 Turbo C ++ ,但我想知道为什么这些错误带有 Visual C ++

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 个答案:

答案 0 :(得分:3)

std::fstream file;而不是fstream file;,因为fstream在标准名称空间std中声明,而不是在全局名称空间中声明。

在与.cpp对应的FileOp.h文件中,如果您不想在任何地方输入using namespace std;,可以选择在该.cpp文件中说std::在该文件中(它基本上是一个品味的问题以及你想要获得名称冲突的可能性。使std::的所有名称都不合格可能会增加名称与全局名称冲突的可能性)。但是不要把这样的一行放到标题中。

由于您的代码似乎完全属于一个.h文件,因此您将没有这样的选项。但是,您可以在成员函数中本地说using namespace std;,或者在个人成员函数的本地范围内将个别名称声明为别名,如using std::fstream;,如果需要。

此外,如果您愿意,您还需要将(成员模板的)成员函数()的定义放在标题保护中,如果不是直接在类体内。出现其他错误消息是因为您多次包含标题,但出现在标题保护之外的成员函数定义会错误地多次发送到翻译单元,从而在编译时引发多个定义错误。