mardi 23 mai 2017

Cannot compile on Ubuntu but compilation works on Mac OS X: no matching function for call to ‘find'

I am trying to compile a C++ program on Ubuntu (in a Vagrant environment). It compiles fine on Mac OS X Sierra but fails on Ubuntu with the following error:

error: no matching function for call to ‘find(std::vector<std::basic_string<char> >::const_iterator, std::vector<std::basic_string<char> >::const_iterator, const string&)’

Compilation

I compile my program with a make file which calls the following:

g++ -std=c++11 -g -Wall -I include -c -o build/main.o src/main.cpp

The compiler version in Mac OS X is:

g++ --version
Configured with: --prefix=/Applications/http://ift.tt/1d5DwEL --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.1.0 (clang-802.0.42)
Target: x86_64-apple-darwin16.0.0
Thread model: posix
InstalledDir: /Applications/http://ift.tt/1z8WHIF

And the compiler version in Ubuntu is:

g++ --version
g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Full error message

I receive the following error when compiling in Ubuntu:

src/main.cpp: In member function ‘const string& InputParser::getCmdOption(const string&) const’:
src/main.cpp:49:78: error: no matching function for call to ‘find(std::vector<std::basic_string<char> >::const_iterator, std::vector<std::basic_string<char> >::const_iterator, const string&)’
             itr =  std::find(this->tokens.begin(), this->tokens.end(), option);
                                                                              ^
src/main.cpp:49:78: note: candidate is:
In file included from /usr/include/c++/4.8/bits/locale_facets.h:48:0,
                 from /usr/include/c++/4.8/bits/basic_ios.h:37,
                 from /usr/include/c++/4.8/ios:44,
                 from /usr/include/c++/4.8/ostream:38,
                 from /usr/include/c++/4.8/iostream:39,
                 from src/main.cpp:1:
/usr/include/c++/4.8/bits/streambuf_iterator.h:369:5: note: template<class _CharT2> typename __gnu_cxx::__enable_if<std::__is_char<_CharT2>::__value, std::istreambuf_iterator<_CharT> >::__type std::find(std::istreambuf_iterator<_CharT>, std::istreambuf_iterator<_CharT>, const _CharT2&)
     find(istreambuf_iterator<_CharT> __first,
     ^
/usr/include/c++/4.8/bits/streambuf_iterator.h:369:5: note:   template argument deduction/substitution failed:
src/main.cpp:49:78: note:   ‘__gnu_cxx::__normal_iterator<const std::basic_string<char>*, std::vector<std::basic_string<char> > >’ is not derived from ‘std::istreambuf_iterator<_CharT>’
             itr =  std::find(this->tokens.begin(), this->tokens.end(), option);
                                                                              ^
src/main.cpp: In member function ‘bool InputParser::cmdOptionExists(const string&) const’:
src/main.cpp:58:78: error: no matching function for call to ‘find(std::vector<std::basic_string<char> >::const_iterator, std::vector<std::basic_string<char> >::const_iterator, const string&)’
             return std::find(this->tokens.begin(), this->tokens.end(), option)
                                                                              ^
src/main.cpp:58:78: note: candidate is:
In file included from /usr/include/c++/4.8/bits/locale_facets.h:48:0,
                 from /usr/include/c++/4.8/bits/basic_ios.h:37,
                 from /usr/include/c++/4.8/ios:44,
                 from /usr/include/c++/4.8/ostream:38,
                 from /usr/include/c++/4.8/iostream:39,
                 from src/main.cpp:1:
/usr/include/c++/4.8/bits/streambuf_iterator.h:369:5: note: template<class _CharT2> typename __gnu_cxx::__enable_if<std::__is_char<_CharT2>::__value, std::istreambuf_iterator<_CharT> >::__type std::find(std::istreambuf_iterator<_CharT>, std::istreambuf_iterator<_CharT>, const _CharT2&)
     find(istreambuf_iterator<_CharT> __first,
     ^
/usr/include/c++/4.8/bits/streambuf_iterator.h:369:5: note:   template argument deduction/substitution failed:
src/main.cpp:58:78: note:   ‘__gnu_cxx::__normal_iterator<const std::basic_string<char>*, std::vector<std::basic_string<char> > >’ is not derived from ‘std::istreambuf_iterator<_CharT>’
             return std::find(this->tokens.begin(), this->tokens.end(), option)

main.cpp

In my main.cpp, I have the following code (partly taken from another SO post):

#include <iostream>
#include <fstream>
#include <istream>
#include <sstream>
#include <iomanip>
#include <random>
#include <ctime>
#include <string>

#include <sys/param.h>
#include <unistd.h>
#include <stdlib.h>
#include <limits.h>
#include <algorithm>

// other includes from other header files

class InputParser{
    public:
        InputParser (int &argc, char **argv){
            for (int i=1; i < argc; ++i)
                this->tokens.push_back(std::string(argv[i]));
        }
        /// @author iain
        const std::string& getCmdOption(const std::string &option) const{
            std::vector<std::string>::const_iterator itr;
            itr =  std::find(this->tokens.begin(), this->tokens.end(), option);
            if (itr != this->tokens.end() && ++itr != this->tokens.end()){
                return *itr;
            }
            static const std::string empty_string("");
            return empty_string;
        }
        /// @author iain
        bool cmdOptionExists(const std::string &option) const{
            return std::find(this->tokens.begin(), this->tokens.end(), option)
                   != this->tokens.end();
        }
    private:
        std::vector <std::string> tokens;
};

int main(int argc, char *argv[])
{
    // Read input args
    InputParser input(argc, argv);

    // etc.

    return 0;
}

Do you have any suggestion on how to compile my program in Ubuntu? Thanks a lot for your help and your time!

Aucun commentaire:

Enregistrer un commentaire