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