g ++ отклоняет мой простой функтор с “ожидаемым тип, получил 'xyz'”

Во время написания запроса вы можете следовать нескольким вещам:

1. Analyze your data.
2. Make sure you have created necessary indexes.
3. In Select statement write only required column, avoid unnecessary columns.
4. Do not write subquery or co-related query until and unless is required.

Давайте посмотрим, могут ли помочь следующие шаги. Но Inner Join - это базовое соединение, которое нельзя заменить, если вам нужно объединить две таблицы.

5
задан Ned 5 May 2009 в 14:04
поделиться

5 ответов

Вам необходимо специализировать std :: less с типом сравнения, который вы используете.

Pair1stFunc2<MyPair, std::less<int> >()

поможет вам. В вашем собственном операторе () вам также нужно создать экземпляр объекта типа сравнения, поскольку вы не можете просто вызвать класс напрямую. Например, измените

return F(lhs.first, rhs.first);

на

F func;
return func(lhs.first, rhs.first);

. Вы также можете переместить специализацию в функтор, как предлагает другой ответ.

2
ответ дан 18 December 2019 в 13:19
поделиться

Чтобы раскрыть ответ Диркгентли, вот пример того, что может сработать так, как вы намеревались:

template <typename T, template <typename> class F>
struct Pair1stFunc2
{
    template <typename P>
    typename F<T>::result_type operator()(P &lhs, P &rhs) const
    { F<T> f; return f(lhs.first, rhs.first); }

    template <typename P>
    typename F<T>::result_type operator()(const P &lhs, const P &rhs) const
    { F<T> f; return f(lhs.first, rhs.first); }
};

void foo(void)
{
    std::sort(pairs.begin(),
              pairs.end(),
              Pair1stFunc2<int, std::less>());
}

Обратите внимание, что это работает, но это может быть не совсем то, что вы имели в виду.

6
ответ дан 18 December 2019 в 13:19
поделиться

Аналогично unwesen. Но вам не нужно использовать шаблоны шаблонов.

#include <algorithm>
#include <functional>
#include <memory>
#include <vector>

typedef std::pair<int,int> MyPair;
typedef std::vector<MyPair> MyPairList;
MyPairList pairs;


// Same as original.
template <typename T,typename F>
struct Pair1stFunc2
{
    template <typename P>
    typename F::result_type operator()(P &lhs, P &rhs) const
    { F f;  // Just need to create an anstance of the functor to use.
      return f(lhs.first, rhs.first); }

    template <typename P>
    typename F::result_type operator()(const P &lhs, const P &rhs) const
    { F f;  // Just need to create an anstance of the functor to use.
      return f(lhs.first, rhs.first); }
};


void foo(void)
{
    std::sort(pairs.begin(),
              pairs.end(),
              Pair1stFunc2<int, std::less<int> >()); // initialize the version of less
}
2
ответ дан 18 December 2019 в 13:19
поделиться

Обратите внимание, что std :: less сам по себе является шаблоном, и вы не указываете параметр шаблона шаблона, когда вызываете его из foo () сортировка функции ! Здесь меньше является неполным типом и, следовательно, проблема.

3
ответ дан 18 December 2019 в 13:19
поделиться

Простейшим решением было бы указать, что вы хотите в качестве аргумента, функцию с подходящей сигнатурой:

template<typename P, bool (*F)(P,P)> struct Pair1stFunc2 { ... }

В этом случае передача шаблона функции в качестве второго аргумента вызовет разрешение перегрузки. должно быть сделано с P, P в качестве типов аргументов. Это работает, потому что вы перемещаете разрешение перегрузки из struct Pair1stFunc2 :: operator ()

Вы также хотите иметь возможность передать функтор , но они должны быть переданы как шаблон Аргумент type, а затем созданный внутри operator ():

typename F::result_type operator()(const P &lhs, const P &rhs) const
{ return F()(lhs.first, rhs.first); }

Здесь F - это тип функтора, а F () - экземпляр этого функтора.

Третий случай уже описан ранее, шаблон функтора. std :: less - это такой шаблон. В этом случае вам понадобится аргумент шаблона шаблона.

1
ответ дан 18 December 2019 в 13:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: