векторный шаблон противоречивой декларации - PullRequest
0 голосов
/ 02 октября 2010

Я пытаюсь реализовать функцию, которая позволяет мне сделать такой вызов

    // vec5 is a vector of tuples in my case
    // some code that to declare and fill vec5
    columnViewOfTuple<0>(vec5);

Я реализовал такую ​​функцию следующим образом

template<int N>
struct myfunction {
    template<typename T, typename R>
    std::vector<R> operator() (T& container)
    {
        std::vector<R> myvector;
        for(typename T::iterator it = container.begin(); it!=container.end(); it++)
            myvector.push_back((R)(*it).template get<N>());
        return myvector;
    }
};

всякий раз, когда я вызываю myfunction <0> (vec5), где vec5 - некоторый вектор кортежей, он говорит

main.cpp: В функции 'int main ()': main.cpp: 156: ошибка: конфликтующее объявление 'myfunction <0> vec5' main.cpp: 155: ошибка: у 'vec5' есть предыдущее объявление как 'main () :: vec1_t vec5'

Ребята, вы знаете, как это исправить?

Спасибо

Ответы [ 2 ]

2 голосов
/ 02 октября 2010

myfunction<0>(vec5); на самом деле myfunction<0> vec5;. Он объявляет объект и не создает временный объект. Вы должны устранить неоднозначность оператора, чтобы он был выражением выражения

(myfunction<0>(vec5));

Но в конечном итоге то, что вы хотите сделать, это

myfunction<0>()(vec5);

Потому что то, что вы написали, намеревалось создать временное и передать vec5 в качестве параметра конструктора. На самом деле необходимо создать объект с помощью конструктора по умолчанию, а затем вызвать оператор вызова функции, как описано выше.

1 голос
/ 02 октября 2010

Йоханнес объяснил, что не так.

Это то, что вы могли бы сделать.

1) Я не вижу необходимости в том, чтобы это была структура, следовательно, свободная функция (делайте так, как вам удобно).

2) Тип n-го элемента можно запросить из кортежа с помощью boost::tuples::element (а тип кортежа можно запросить из контейнера с помощью value_typetypedef - нет необходимости в параметре R.

#include <boost/tuple/tuple.hpp>
#include <vector>

template <int N, class TupleContainer>
std::vector<typename boost::tuples::element<N, typename TupleContainer::value_type>::type>
  copy_tuple_column(const TupleContainer& c)
{
    std::vector<typename boost::tuples::element<N, typename TupleContainer::value_type>::type> results;
    for (typename TupleContainer::const_iterator it = c.begin(); it != c.end(); ++it) {
        results.push_back(boost::tuples::get<N>(*it));
    }
    return results;
}

int main()
{
    std::vector<boost::tuple<int, double> > tuples;
    std::vector<int> ints = copy_tuple_column<0>(tuples);
    std::vector<double> doubles = copy_tuple_column<1>(tuples);
}
...