Об аргументе шаблона по умолчанию в шаблоне функции

Я понял, что в C++11 возможно иметь значение по умолчанию в аргументах шаблона функции-шаблона. До сих пор это было разрешено только для занятий.

Я всегда думал, что установка значения по умолчанию в аргументе шаблона в C++11 будет означать что-то вроде ниже

 // C++11 target code
 template<class Iterator, class AFunctor=mybinary_fnctr>
 void myFunction(Iterator first, Iterator last, AFunctor fnctr);

Вместо этого я попытался сделать следующее, полагая, что традиционный C++ будет работать

 // C++ traditional
 template<class Iterator, class AFunctor>
 void myFunction(Iterator first, Iterator last, AFunctor fnctr=mybinary_fnctr);

Ошибка с примером кода ниже является следующим

 error: no matching function for call to ‘algo(__gnu_cxx::__normal_iterator<A*,
 std::vector<A, std::allocator<A> > >, __gnu_cxx::__normal_iterator<A*, 
 std::vector<A, std::allocator<A> > >)’

Компилятор пытается установить значение по умолчанию для одного из аргументов шаблона (хотя синтаксис немного отличается) или я что-то не так делаю?

 namespace util {
 template<class T>
  int get(const T& obj);
 }

 class A {
  public:
   A(int a): data_(a) {}
   int data() const { return data_; }
  private:
   int data_;
  };

  namespace util {
  template<>
  int get<A>(const A& obj) {
   return obj.data();
  } }

 template <class Iterator,class GetFunction>
 void algo(Iterator first, Iterator last, 
 GetFunction foo=boost::bind(&util::get<typename Iterator::value_type>,_1)) 
 {
  while(first != last) {
   cout << foo(*first) << endl;
   ++first;
  } }

 int main() {
  A cntr[] = { A(10), A(20), A(30) };
  A* p = cntr;
  vector<A> ptr(p, p+3);

  algo(ptr.begin(), ptr.end()); // doesn't build
  //algo(cntr, cntr+3, boost::bind(&util::get<A>,_1)); // ok
  }

0 ответов

Другие вопросы по тегам