Ошибки Соединения C++: Неопределенные символы с помощью шаблонного класса

Чтобы получить то, что вы хотите (=sum(repeatuniqueformula(sum(if(randbetween(1,100) > subtotal(1,L23), 0, 1)), x))), вам нужно создать пользовательскую функцию с помощью Google Apps Script, но x следует заменить числом или ссылкой на ячейку, имеющую значение или формула, которая возвращает это значение.

Ссылки

6
задан epochwolf 23 November 2008 в 04:32
поделиться

4 ответа

При определении шаблона в .cpp файле необходимо явно инстанцировать его со всеми типами / шаблонные параметры, известные, шаблон будет использоваться заранее как это (поместите его в .cpp файл):

template class TreeNode<Player>;

Если Вы не знаете, с которыми шаблонными параметрами будет использоваться шаблон, необходимо поместить все определения в заголовок. как

template<typename T>
class TreeNode {
public:
   TreeNode() /* now, also put the code into here: */ { doSomething(); }
};

Причина состоит в том, что, когда Вы собираетесь использовать шаблон от где-нибудь, компилятор должен смочь сгенерировать код для того определенного инстанцирования шаблона. Но если Вы помещаете код в .cpp файл и компилируете его, нет никакого пути к компилятору для доставления код для генерации инстанцирования (кроме тех случаев, когда использование печально известного export ключевое слово, которое только поддерживается очень немногими компиляторами).

Это - также запись в моем ответе Ловушек C++: Каких ловушек C++ я должен избежать?

14
ответ дан 8 December 2019 в 13:50
поделиться

Хорошо Вы объявляете ~TreeNode (), но Вы определяете его?

Когда Вы объявляете деструктор, Вы мешаете компилятору генерировать один для Вас, но необходимо определить его где-нибудь, даже если это пусто.

Если Ваше намерение состояло в том, чтобы иметь пустой деструктор, у Вас есть две опции:

- Удалите объявление ~TreeNode () полностью и полагайтесь сам, сгенерированный деструктор - Определяет его как пустой. Inling был бы очень хорош здесь, IE. ~TreeNode () {};

2
ответ дан 8 December 2019 в 13:50
поделиться

Компилятор жалуется на не нахождение реализации деструктора. Как указано прежде, если Вы действительно объявляете деструктор, компилятор автоматически не генерирует один для Вас.

К предложению David Reis или удаления или обеспечения пустого деструктора, я ясно пошел бы для второго. Если Ваш класс предназначен, чтобы быть полученным (у Вас есть виртуальные методы), затем, необходимо обеспечить виртуальный деструктор, даже если это пусто (то же относится к BaseNode).

Если Вы будете зависеть от сгенерированной версии компилятора, и пользовательский код удаляет производный объект через указатель на базовый класс, конструктор которого не является виртуальным затем, то деструктор производного объекта не назовут, возможно пропуская ресурсы.

1
ответ дан 8 December 2019 в 13:50
поделиться

Вы забываете связывать объектный файл, содержащий тела функции для Ваших функций класса?

Например, у Вас было бы что-то вроде этого в .cpp:

TreeNode::TreeNode() :
    /* initializers here */
{
    // ...
}

TreeNode::~TreeNode()
{
    // ...
}
0
ответ дан 8 December 2019 в 13:50
поделиться
Другие вопросы по тегам:

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