шаблон вектора - PullRequest
       26

шаблон вектора

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

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

// veca is a vector of tuples in my case
columnViewOfTuple<0>(veca);

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

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 ]

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

Цикл должен быть

    for(typename T::iterator it = container.begin(); it!=container.end(); it++)
        myvector.push_back((R)(*it).template get<N>());

В противном случае компилятор будет обрабатывать T::iterator как не тип (во время анализа он еще не знает, что будет T::iterator позже!) и, вероятно, проанализирует его как единственную составляющую выражения.Далее следует it, что является бессмысленным для компилятора, поэтому он ожидает ; перед ним.

typename используется, чтобы сообщить компилятору, что определенное квалифицированное имя предназначено для обозначения типа вместозначение (функция / статический член данных / и т. д.).

Второй вопрос, который решается добавлением template, аналогичного типа.Он сообщает компилятору, что get является шаблоном и, следовательно, <N - это не сравнение с N, а начало списка аргументов шаблона.

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

Вам нужно использовать typename перед T::iterator.Скажем, typename T::iterator.

Edit1, включая template, как указано Йоханнесом, чтобы предотвратить дезинформацию.

Итак, ваш код должен выглядеть следующим образом:

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;
    }
};
...