Об аргументе шаблона по умолчанию в шаблоне функции
Я понял, что в 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
}