2016-09-02 3 views
-1

Я встретив ошибку во время компиляции с следующим выводом:C++: функция не может быть перегружена

$ g++ -ggdb `pkg-config --cflags opencv` -o `basename main.cpp .cpp` main.cpp StringMethods/StringMethods.cpp `pkg-config --libs opencv` -std=c++0x 
In file included from main.cpp:2:0: 
VideoFile.hpp:32:10: error: ‘bool VideoFile::fileExists(const string&)’ cannot be overloaded 
    bool fileExists(const std::string & path) 
     ^
VideoFile.hpp:15:10: error: with ‘bool VideoFile::fileExists(const string&)’ 
    bool fileExists(const std::string & path); 

Однако, я не вижу, как эта ошибка имеет смысл, потому что у меня есть только объявление функции, которые я непосредственно скопированный и вставлен при написании определения.

class VideoFile 
{ 
private: 
    std::string filePath; 
    bool fileExists(const std::string & path); 

public: 

    VideoFile(const std::string & path) 
     :filePath(path) 
    { 
     filePath = StringMethods::trim(path); 
     if (!fileExists(filePath)) 
      throw std::runtime_error("The file: " + filePath + " was not accessible"); 
    } 

    ~VideoFile() 
    { 

    } 

    bool fileExists(const std::string & path) 
    { 
     std::ifstream file(path); 
     return file.good(); 
    } 
}; 

ответ

4

Вы не можете объявить и определить функцию-член внутри определения класса.

(Вы даже сделали заявление частного и государственного определения.)

Либо удалить объявление или переместить определение вне определения класса (я рекомендую последний).

4

Вы fileExists дважды в классе itself.Once без определения

bool fileExists(const std::string & path); 

и один раз Defintion

bool fileExists(const std::string & path) 
{ 
    std::ifstream file(path); 
    return file.good(); 
} 

У вас есть два варианта либо удалить без определения части, или удалить с частью определения и определите определение вне класса.

1

Поскольку метод уже объявлен, вы должны определить его вне объявления класса:

class VideoFile 
{ 
    // ... 
    bool fileExist(const std::string path); 
    // ... 
}; 

bool VideoFile::fileExist(const std::string& path) 
{ 
    // ... 
} 
1

вы не можете перегрузить функцию FileExists на другой с теми же параметрами, просто используя различные сферы, как вы делаете в вашем примере. Вы можете сохранить две функции fileExists, которые у вас есть, но вам нужно использовать разные параметры, как указано ниже:

 class VideoFile 
    { 
     private: 

     bool fileExists(); 

     public: 

     bool fileExists(const std::string & path) // overloading bool fileExists(); 
     { 
     std::ifstream file(path); 
     return file.good(); 
     } 
    }; 
Смежные вопросы