Как Вы создаете статическую шаблонную функцию членства, которая выполняет действия с шаблонным классом?

Чтобы добавить ответ Андрея, я полагаю, что вы можете также распаковать массивы, чтобы сделать его немного чище:

[{'section': i+1, 'x': x, 'y': y} for i, [x, y] in enumerate(myarray) if i in [2, 6, 9]]
25
задан bsruth 30 September 2015 в 16:53
поделиться

6 ответов

Короткий Ответ

Определяет функцию в заголовке, предпочтительно в определении класса.

ответ Long

Определение шаблонной функции в .cpp означает, что не доберется #include d ни в какие единицы перевода: это только будет доступно единице перевода, в которой это определяется.

Следовательно RemoveVectorDuplicates должен быть определен в заголовке, поскольку это - единственный способ, которым компилятор может текстовая замена аргументы шаблона, следовательно инстанцирование шаблон, производя применимый класс.

существует два обходных решения для этого неудобства

Первые , можно удалить #include "foo.h" из .cpp и добавить другой, в конец из заголовок :

#include "foo.cpp"

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

1121-секундный , можно просто определить шаблонную функцию в .cpp и явно инстанцировать его для всех типов, с которыми это будет когда-либо использоваться.

, Например, это может войти в конец .cpp для создания функции применимой с int с:

template void Foo::RemoveVectorDuplicates(std::vector<int>*);

Однако это предполагает, что Вы только используете шаблоны, чтобы сохранить некоторый ввод, вместо того, чтобы обеспечить истинную степень универсальности.

31
ответ дан 28 November 2019 в 21:19
поделиться

Одна альтернатива, которую Вы имеете, к первому std::sort() вектор, и затем используйте существование ранее std::unique() функция для удаления дубликатов. Вид берет O (nlog n) время, и удаляющие дубликаты после этого берут просто O (n) время, поскольку все дубликаты появляются в единственном блоке. Ваш текущий "all-all" алгоритм сравнения берет O (n^2) время.

5
ответ дан j_random_hacker 28 November 2019 в 21:19
поделиться

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

Просто определяют функцию в определении класса в заголовке. Это - обычный способ реализовать шаблонные функции.

2
ответ дан jalf 28 November 2019 в 21:19
поделиться

Я предложу использовать более "универсальный" подход, вместо того, чтобы передать контейнер просто получают два итератора.

Что-то как Он remove_duplicates (Это сначала, Это длится), и возвратит итератор, таким образом, можно звонить как, удалите: v.erase(remove_duplicates(v.begin(), v.end()), v.end()).

template <typename It>
It remove_duplicate(It first, It last)
{
  It current = first;
  while(current != last) {
    // Remove *current from [current+1,last)
    It next = current;
    ++next;
    last = std::remove(next, last, *current);
    current = next;
  }
  return last;
}
1
ответ дан Ismael 28 November 2019 в 21:19
поделиться

Не связанный с Вашей проблемой (который уже был объяснен), почему это - статическая функция вместо того, чтобы находиться глобально в пространстве имен? Это было бы несколько C ++-ier.

0
ответ дан Konrad Rudolph 28 November 2019 в 21:19
поделиться

Я не думаю тот код компиляции....

vectorToUpdate.erase, где станд.:: вектор* vectorToUpdate.... делает кто-либо еще замечает, что существует *, где должен быть &? тот код определенно не компилируется. если Вы собираетесь использовать указатель для векторизации Вас, должен использовать '->', вместо'.' я знаю, что это - на самом деле немного придирчивой гниды, но это указывает, что компилятор даже не заботится о Вашем коде...

0
ответ дан Hippiehunter 28 November 2019 в 21:19
поделиться
Другие вопросы по тегам:

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