Почему я получаю ошибки “неразрешенной внешней ссылки” при использовании шаблонов? [дубликат]

В ваших forms.py

class FRM_LINE_REPORT(exform):

   CompanyName  =   TextField(requiredlabel("Company Name", "*"), [validators.Required()])

В ваших models.py

class MKT_LINE_REPORT(exmodel):
CompanyName     =   db.Column(db.String(100))

В вашем html или Jinja: # не забывайте форму возврата = FRM_LINE_REPORT () к jinja или html

{{ form.CompanyName(class="form-control", placeholder="Company Name", autocomplete="True") }}
90
задан dlanod 19 January 2009 в 22:49
поделиться

2 ответа

Шаблонные классы и функции не инстанцируют, пока они не используются, обычно в отдельном .cpp файле (например, источник программы). Когда шаблон используется, для компилятора нужен полный код для той функции, чтобы быть в состоянии создать корректную функцию с соответствующим типом. Однако в этом случае код для той функции детализирован в исходном файле шаблона и следовательно недоступный.

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

решения, доступные для этого, к:

  1. включают полное определение функции членства в заголовочном файле шаблона и не имеют исходный файл для шаблона,
  2. определяют все функции членства в исходном файле шаблона, как "встроенный", или
  3. <забастовка> определяют функции членства в источнике шаблона с ключевым словом "экспорта". К сожалению, это не поддерживается большим количеством компиляторов. (Обновление: это было удалено из стандарта с C++ 11 .)

И 1 и 2 в основном решают проблему путем предоставления доступа компилятора к полному коду для шаблонной функции, когда это пытается создать введенную функцию в источнике программы.

110
ответ дан dlanod 5 November 2019 в 14:22
поделиться

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

13
ответ дан shoosh 5 November 2019 в 14:22
поделиться
Другие вопросы по тегам:

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