opencog / moses

MOSES Machine Learning: Meta-Optimizing Semantic Evolutionary Search. See also AS-MOSES https://github.com/opencog/asmoses but kept to guaranty backward compatibility.
https://wiki.opencog.org/w/Meta-Optimizing_Semantic_Evolutionary_Search
Other
127 stars 83 forks source link

error: call of overloaded distance is ambiguous #61

Closed StrangeTcy closed 6 years ago

StrangeTcy commented 6 years ago

On Ubuntu 16.04 x64, with boost 1.68 and gcc 8.2, building moses fails with the following errors and warnings:

-- Build files have been written to: /tmp/moses-master/build
Scanning dependencies of target combo-man
Scanning dependencies of target feature_selection
Scanning dependencies of target moses_exec
Scanning dependencies of target comboreduct
[  0%] Generating eval-table.1.gz
[  0%] Built target combo-man
Scanning dependencies of target moses-man
[  0%] Generating moses.1.gz
[  0%] Built target moses-man
Scanning dependencies of target feature-man
[  0%] Generating feature-selection.1.gz
[  0%] Built target feature-man
[  0%] Building CXX object moses/moses/main/CMakeFiles/moses_exec.dir/demo-problems.cc.o
[  1%] Building CXX object moses/moses/main/CMakeFiles/moses_exec.dir/problem.cc.o
[  1%] Building CXX object moses/feature-selection/CMakeFiles/feature_selection.dir/algo/deme_optimize.cc.o
[  3%] Building CXX object moses/comboreduct/CMakeFiles/comboreduct.dir/crutil/exception.cc.o
[  3%] Building CXX object moses/comboreduct/CMakeFiles/comboreduct.dir/combo/action.cc.o
[  5%] Building CXX object moses/comboreduct/CMakeFiles/comboreduct.dir/combo/action_symbol.cc.o
[  5%] Building CXX object moses/moses/main/CMakeFiles/moses_exec.dir/problem-params.cc.o
[  7%] Building CXX object moses/feature-selection/CMakeFiles/feature_selection.dir/algo/incremental.cc.o
[  7%] Building CXX object moses/comboreduct/CMakeFiles/comboreduct.dir/combo/assumption.cc.o
[  7%] Building CXX object moses/feature-selection/CMakeFiles/feature_selection.dir/algo/random.cc.o
[  7%] Building CXX object moses/comboreduct/CMakeFiles/comboreduct.dir/combo/builtin_action.cc.o
[  9%] Building CXX object moses/comboreduct/CMakeFiles/comboreduct.dir/combo/definite_object.cc.o
[  9%] Building CXX object moses/comboreduct/CMakeFiles/comboreduct.dir/combo/descriptions.cc.o
[  9%] Building CXX object moses/comboreduct/CMakeFiles/comboreduct.dir/combo/enum_type.cc.o
[  9%] Building CXX object moses/feature-selection/CMakeFiles/feature_selection.dir/algo/simple.cc.o
[  9%] Building CXX object moses/moses/main/CMakeFiles/moses_exec.dir/moses_exec.cc.o
[ 11%] Building CXX object moses/comboreduct/CMakeFiles/comboreduct.dir/combo/indefinite_object.cc.o
[ 11%] Building CXX object moses/comboreduct/CMakeFiles/comboreduct.dir/combo/iostream_combo.cc.o
[ 11%] Building CXX object moses/comboreduct/CMakeFiles/comboreduct.dir/combo/message.cc.o
/tmp/moses-master/moses/comboreduct/combo/iostream_combo.cc: In function ‘std::__cxx11::string opencog::combo::l2ph(const string&, const std::vector<std::__cxx11::basic_string<char> >&)’:
/tmp/moses-master/moses/comboreduct/combo/iostream_combo.cc:543:64: error: call of overloaded ‘distance(std::vector<std::__cxx11::basic_string<char> >::const_iterator, __gnu_cxx::__normal_iterator<const std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > >&)’ is ambiguous
                 arity_t idx = distance(labels.begin(), found_it) + 1;
                                                                ^
In file included from /usr/include/c++/8/bits/stl_algobase.h:66,
                 from /usr/include/c++/8/bits/char_traits.h:39,
                 from /usr/include/c++/8/ios:40,
                 from /usr/include/c++/8/ostream:38,
                 from /usr/include/c++/8/iostream:39,
                 from /tmp/moses-master/moses/comboreduct/combo/iostream_combo.h:28,
                 from /tmp/moses-master/moses/comboreduct/combo/iostream_combo.cc:24:
/usr/include/c++/8/bits/stl_iterator_base_funcs.h:138:5: note: candidate: ‘typename std::iterator_traits<_Iterator>::difference_type std::distance(_InputIterator, _InputIterator) [with _InputIterator = __gnu_cxx::__normal_iterator<const std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > >; typename std::iterator_traits<_Iterator>::difference_type = long int]’
     distance(_InputIterator __first, _InputIterator __last)
     ^~~~~~~~
In file included from /usr/local/include/boost/range/distance.hpp:18,
                 from /usr/local/include/boost/range/functions.hpp:21,
                 from /usr/local/include/boost/range/iterator_range_core.hpp:38,
                 from /usr/local/include/boost/lexical_cast.hpp:30,
                 from /tmp/moses-master/moses/comboreduct/combo/iostream_combo.h:30,
                 from /tmp/moses-master/moses/comboreduct/combo/iostream_combo.cc:24:
/usr/local/include/boost/iterator/distance.hpp:49:9: note: candidate: ‘typename boost::iterators::iterator_difference<Iterator>::type boost::iterators::distance_adl_barrier::distance(SinglePassIterator, SinglePassIterator) [with SinglePassIterator = __gnu_cxx::__normal_iterator<const std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > >; typename boost::iterators::iterator_difference<Iterator>::type = long int]’
         distance(SinglePassIterator first, SinglePassIterator last)
         ^~~~~~~~
/tmp/moses-master/moses/comboreduct/combo/iostream_combo.cc:556:56: error: call of overloaded ‘distance(std::vector<std::__cxx11::basic_string<char> >::const_iterator, __gnu_cxx::__normal_iterator<const std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > >&)’ is ambiguous
         arity_t idx = distance(labels.begin(), found_it) + 1;
                                                        ^
In file included from /usr/include/c++/8/bits/stl_algobase.h:66,
                 from /usr/include/c++/8/bits/char_traits.h:39,
                 from /usr/include/c++/8/ios:40,
                 from /usr/include/c++/8/ostream:38,
                 from /usr/include/c++/8/iostream:39,
                 from /tmp/moses-master/moses/comboreduct/combo/iostream_combo.h:28,
                 from /tmp/moses-master/moses/comboreduct/combo/iostream_combo.cc:24:
/usr/include/c++/8/bits/stl_iterator_base_funcs.h:138:5: note: candidate: ‘typename std::iterator_traits<_Iterator>::difference_type std::distance(_InputIterator, _InputIterator) [with _InputIterator = __gnu_cxx::__normal_iterator<const std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > >; typename std::iterator_traits<_Iterator>::difference_type = long int]’
     distance(_InputIterator __first, _InputIterator __last)
     ^~~~~~~~
In file included from /usr/local/include/boost/range/distance.hpp:18,
                 from /usr/local/include/boost/range/functions.hpp:21,
                 from /usr/local/include/boost/range/iterator_range_core.hpp:38,
                 from /usr/local/include/boost/lexical_cast.hpp:30,
                 from /tmp/moses-master/moses/comboreduct/combo/iostream_combo.h:30,
                 from /tmp/moses-master/moses/comboreduct/combo/iostream_combo.cc:24:
/usr/local/include/boost/iterator/distance.hpp:49:9: note: candidate: ‘typename boost::iterators::iterator_difference<Iterator>::type boost::iterators::distance_adl_barrier::distance(SinglePassIterator, SinglePassIterator) [with SinglePassIterator = __gnu_cxx::__normal_iterator<const std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > >; typename boost::iterators::iterator_difference<Iterator>::type = long int]’
         distance(SinglePassIterator first, SinglePassIterator last)
         ^~~~~~~~
[ 13%] Building CXX object moses/comboreduct/CMakeFiles/comboreduct.dir/combo/perception.cc.o
moses/comboreduct/CMakeFiles/comboreduct.dir/build.make:179: recipe for target 'moses/comboreduct/CMakeFiles/comboreduct.dir/combo/iostream_combo.cc.o' failed
make[2]: *** [moses/comboreduct/CMakeFiles/comboreduct.dir/combo/iostream_combo.cc.o] Error 1
make[2]: *** Waiting for unfinished jobs....
[ 15%] Building CXX object moses/moses/main/CMakeFiles/moses_exec.dir/moses_exec_def.cc.o
[ 15%] Building CXX object moses/moses/main/CMakeFiles/moses_exec.dir/table-problems.cc.o
[ 17%] Building CXX object moses/feature-selection/CMakeFiles/feature_selection.dir/algo/stochastic_max_dependency.cc.o
CMakeFiles/Makefile2:343: recipe for target 'moses/comboreduct/CMakeFiles/comboreduct.dir/all' failed
make[1]: *** [moses/comboreduct/CMakeFiles/comboreduct.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
[ 17%] Building CXX object moses/feature-selection/CMakeFiles/feature_selection.dir/scorers/moses_optim.cc.o
[ 17%] Building CXX object moses/feature-selection/CMakeFiles/feature_selection.dir/main/feature-selection.cc.o
[ 19%] Linking CXX shared library libmoses_exec.so
[ 19%] Built target moses_exec
[ 21%] Linking CXX shared library libfeature_selection.so
[ 21%] Built target feature_selection
Makefile:151: recipe for target 'all' failed
make: *** [all] Error 2

I'll try to figure out a way to disambiguate that call to distance, but I'm not that knowledgeable in C++.

ETA: the type of labels.begin() is std::vector<std::__cxx11::basic_string<char>>::const_iterator. Explicitly casting found_it to the same type instead of using auto didn't get rid of the ambiguity.

StrangeTcy commented 6 years ago

Ok, the solution that has worked is this: replacing auto with an explicit type of label.begin() from the error message. This is, as far as I can tell, an ad-hoc hack, and it really needs someone with more C++ experience to figure out an actual solution.

linas commented 6 years ago

Unless I misunderstand something, the correct solution is to replace distance by std::distance

StrangeTcy commented 6 years ago

I did that as well. A quick check shows that doing only that apparently helps. So I guess that std:: has to be added to distance in two lines, and then the issue could be closed.

ETA: created a PR with those specific edits.

mohd-naushaaad commented 3 years ago

Unless I misunderstand something, the correct solution is to replace distance by std::distance

Thankyou so much it works