【问题标题】:missing ';' before identifier失踪 ';'在标识符之前
【发布时间】:2011-10-15 14:36:26
【问题描述】:

编译时出现这些错误。我找不到错误。特别是为什么需要; 以及为什么已经定义了功能模板。我正在使用 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);
}

【问题讨论】:

  • 我得到了第一个的答案。这是因为我没有使用命名空间。现在我想知道为什么它说功能模板已经定义。我该如何解决这个问题
  • 这里不需要;FileOperations(){};。您在很多地方都在这样做。

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


【解决方案1】:

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

在与FileOp.h 对应的.cpp 文件中,如果您不想在该文件的任何位置输入std::,您可以选择在该.cpp 文件中输入using namespace std;(这基本上是一个品味问题以及您希望发生名称冲突的可能性有多大。使所有 std:: 不合格的名称可见会增加名称与全局名称发生冲突的可能性)。但是不要将这样的行放入标题中。

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

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

【讨论】:

  • 感谢您的快速回复。我想到了。我现在使用了名称空间,它没有给出该错误,但它仍然给出错误 10 错误 C2995:'int FileOperations::getNoOfElements(void)':函数模板已定义错误 9 错误 C2995:'T FileOperations::readFromFile(int)' : 函数模板已定义 错误 8 错误 C2995: 'void FileOperations::swriteToFile(T,int)' : 函数模板已定义错误。你能告诉我这是什么原因吗...?
  • 你能给我看上一期的那根绳子吗?如何将定义放入标头保护中。请
  • 我的意思是在我的代码中把它放在哪里。无论如何感谢到目前为止的帮助。我试图找到如何把它放在头后卫里面。但是我还没有找到。无论如何,如果不可能,那也没关系。我会尝试一些如何找到它。感谢您的大力帮助...
  • 知道了,兄弟。我将整个成员函数放在它自己的类中。现在我正在寻找另一种方法。有人请告诉我什么是头卫
  • @Gihan 你应该先问一下头卫!标题保护是您在开头放置的 #ifndef/#define 东西。 (secure.wikimedia.org/wikipedia/en/wiki/Include_guard)
猜你喜欢
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
相关资源
最近更新 更多