Использование не шаблонных функций в шаблонных классах - PullRequest
0 голосов
/ 18 апреля 2011

У меня есть задача:

Чтобы реализовать класс-шаблон вектора (назовем его myvector).Мне нужно использовать этот класс в нескольких файлах в моем проекте, поэтому я поместил его объявления в файл «myvector.h», а реализацию в файл «myvector.hpp», а затем включил «myvector.hpp» в «myvector».h "после всех объявлений (как описано там ).Тем не менее, у меня есть одна не шаблонная функция в "myvector.hpp".Поэтому, когда я включаю файл «myvector.h» в основной файл, все работает нормально.Но когда я включаю «myvector.h» в другой файл («bignum.cpp»), я получаю ошибку компоновщика:

error LNK2005: "unsigned int __cdecl gerasimov_dmitry::calculate_capacity(unsigned int)" (?calculate_capacity@gerasimov_dmitry@@YAII@Z) already defined in bignum.obj

Я понимаю причины - код «bignum.h» включается в обав файле main.cpp и в файле bignum.cpp, поэтому компилятор не знает, какую из функций «возложить_capacity» следует использовать.Итак, мой вопрос, как исправить эту ситуацию.

1 Ответ

4 голосов
/ 18 апреля 2011

Вы должны объявить функцию inline (или, в качестве альтернативы, переместить определение в одну единицу перевода).

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...