Шаблоны должны использоваться в заголовках, потому что компилятор должен создавать экземпляры разных версий кода в зависимости от параметров, заданных / выведенных для параметров шаблона. Помните, что шаблон не представляет собой код напрямую, а шаблон для нескольких версий этого кода. Когда вы компилируете функцию non-template в файле .cpp
, вы компилируете конкретную функцию / класс. Это не относится к шаблонам, которые могут быть созданы с использованием разных типов, а именно, если при замене параметров шаблона конкретными типами необходимо исправить конкретный код.
Была функция с ключевым словом export
, которая была предназначенный для отдельной компиляции. Функция export
устарела в C++11
и, AFAIK, только один компилятор реализовал ее. Вы не должны использовать export
. Отдельная компиляция невозможна в C++
или C++11
, но, возможно, в C++17
, если понятия в нее входят, мы могли бы иметь некоторый способ отдельной компиляции.
Для отдельной компиляции, которая должна быть достигнута, разделить проверка шаблона тела должна быть возможна. Кажется, что решение возможно с концепциями. Взгляните на этот документ , недавно представленный на совещании по стандартам. Я думаю, что это не единственное требование, поскольку вам все равно необходимо создать код кода шаблона в коде пользователя.
Отдельная проблема компиляции для шаблонов, я думаю, это также проблема, возникающая при миграции на модули, которые в настоящее время работают.
Рассол прекрасно. Это неправильный код. Вы берете указатель на данные массива, не делая ничего, чтобы гарантировать, что эти данные фактически живут до тех пор, пока объект, который его использует.
Вам нужно сохранить ссылку на массив и выполнить связанное управление refcount. pybind11, вероятно, имеет какой-то механизм для представления ссылки Python и обработки refcounting для вас. Из быстрого просмотра docs похоже, что ваш код должен, вероятно, принимать значение array_t
по значению вместо ссылки на const (поскольку array_t
уже представляет ссылку на Python) и сохраняет его в переменная экземпляра array_t
.
df
, которая удерживаетDataFrame
живым в python, достаточно, чтобы массив не уничтожался? Или питон читает заранее и знает, чтоdf
не используется впоследствии, поэтому он может умозрительно удалить ресурсы? – Steve Lorimer 13 July 2018 в 17:34df.values
не гарантируется привязка к DataFrame каким-либо образом; для смешанных dtype DataFrames это будет новый массив. – user2357112 13 July 2018 в 17:36df.values
в переменной, а затем передать это моему коду. К сожалению, к сожалению. Кроме того, я бы подумал, что если бы это было причиной проблемы (время жизни временного), я бы увидел, что авария произошла во всех моих других случаях использования тестов, но я не могу заставить ее рушиться вообще, только с этим конкретным рассолом ( даже с другими файлами рассола) – Steve Lorimer 13 July 2018 в 17:41