Здесь много правильных ответов, но я хотел добавить это (для полноты):
Если вы в нижней части файла cpp реализации выполняете явное инстанцирование всех типов, которые будут использоваться шаблоном с, компоновщик сможет найти их как обычно.
Изменить: добавление примера явного создания экземпляра шаблона. Используется после того, как шаблон определен, и определены все функции-члены.
template class vector<int>;
Это создаст экземпляр (и, следовательно, сделает доступным для компоновщика) класс и все его функции-члены (только). Подобный синтаксис работает для функций шаблона, поэтому, если у вас есть перегрузки операторов, не являющихся членами, вам может понадобиться сделать то же самое для них.
Вышеприведенный пример бесполезен, поскольку вектор полностью определен в заголовках, за исключением случаев, когда common include file (precompiled header?) использует extern template class vector<int>
, чтобы не создавать его из всех других (1000?) файлов, которые используют вектор.
Так что, поскольку вы опубликовали свой результат about: gpu, показывающий, что вы получаете программный рендеринг только для WebGL, который предполагает отображение tenorflow.js в WebGL флага создания контекста failIfMajorPerformanceCaveat
, который почти наверняка потерпит неудачу при рендеринге программного обеспечения [ 1117]
Мы можем проверить путем переопределения getContext
и распечатать флаги создания
<script>
HTMLCanvasElement.prototype.getContext = function(type, parameters) {
console.log(JSON.stringify(parameters, null, 2));
return null;
};
</script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.15.3/dist/tf.min.js"></script>
Так работает, что я см. эти результаты
{
"alpha": false,
"antialias": false,
"premultipliedAlpha": false,
"preserveDrawingBuffer": false,
"depth": false,
"stencil": false,
"failIfMajorPerformanceCaveat": true <====-------
}
Так вот почему он печатает это предупреждение.
Тем не менее, это всего лишь предупреждение . tenorflow.js все еще работает. Обратите внимание (а), что он говорит 2 предупреждения, а не 2 ошибки. (б) они отображаются желтым, а не красным.
с помощью console.warn
против console.error
вы можете увидеть разницу
tenorflow.js отлично работает AFAICT. Вот пример. Я взломал getContext
, поэтому он всегда терпит неудачу, так что tenorflow.js не может получить контекст WebGL. Он выводит 2 предупреждения, но также работает нормально. Прокрутите до конца сообщения, и вы увидите, что он запустил результаты примера кода tenorflow.
const d = tf.tensor2d([[1.0, 2.0], [3.0, 4.0]]);
const d_squared = d.square();
d_squared.print();
<script>
HTMLCanvasElement.prototype.getContext = function() {
return null;
};
</script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.15.3/dist/tf.min.js"></script>