отсутствует ';'перед идентификатором - PullRequest
0 голосов
/ 15 октября 2011

Я получаю эти ошибки при компиляции. Я не могу найти ошибку. Особенно, почему требуется ; и почему шаблоны функций уже определены. Я использую 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 Ответ

3 голосов
/ 15 октября 2011

Скажите std::fstream file; вместо fstream file;, поскольку fstream объявлено в стандартном пространстве имен std, а не в глобальном пространстве имен.

В файле .cpp, соответствующем FileOp.h, вы можете выбрать using namespace std; в этом файле .cpp, если вы не хотите вводить std:: везде в этом файле (это в основномвопрос вкуса и вероятность того, что вы захотите получить конфликты имен. Если все имена std:: безоговорочно видимы, возрастает вероятность конфликтов имен с глобальными именами).Но не помещайте такую ​​строку в заголовок.

Поскольку ваш код представляется целиком в один файл .h, у вас не будет такой возможности.Но вы можете локально в функциях-членах сказать using namespace std; или объявить отдельные имена как псевдонимы в локальной области функций-членов, например, using std::fstream;, если хотите.

Кроме того, вам нужно поместить определение этих функций.функции-члены (из шаблона класса) в пределах защиты заголовка, если не непосредственно в теле класса, если хотите.Ваши другие сообщения об ошибках появляются потому, что вы включаете заголовок несколько раз, но определения функций-членов, появляющиеся за пределами защиты заголовка, будут ошибочно передаваться в модуль перевода несколько раз, вызывая множество ошибок определений во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...