Функциональный объект как параметр шаблона

template <typename elemType, typename Comp = less<elemType> >
class LessThanPred {
    public:
        LessThanPred(const elemType &val) : _val(val){}
        bool operator()(const elemType &val) const
        { return Comp(val, _val); }
        void val(const elemType &newval) { _val = newval; }
        elemType val() const { return _val; }
private:
    elemType _val;};

Это пример из Essential C++. Comp очевидно, имя класса объекта функции. Почему я мог использовать Comp(val, _val) напрямую? Обычно я думаю, что сначала я должен определить функциональный объект следующим образом: Comp comp, а затем вызвать comp не Comp,

1 ответ

Решение

Код as is компилируется, потому что члены шаблона проверяются на семантическую корректность только тогда, когда они создаются. Код синтаксически правильно сформирован, хотя. Однако, когда вы пытаетесь создать экземпляр оператора вызова функции LessThanPred<T>, вы получите ошибку компилятора. Например, с версией clang (3.6.1) Я использую, я получаю

less-than.cpp:8:18: error: no matching constructor for initialization of 'std::less<int>'
        { return Comp(val, _val); }
                 ^    ~~~~~~~~~
less-than.cpp:17:25: note: in instantiation of member function 'LessThanPred<int, std::less<int> >::operator()' requested here
    LessThanPred<int>(2)(1);

при попытке использовать функцию как

LessThanPred<int>(2)(1)
Другие вопросы по тегам