#c #templates #methods #function-templates #class-template
#c #шаблоны #методы #функция-шаблоны #класс-шаблон
Вопрос:
В настоящее время я изучаю, как шаблоны работают в C . В частности, я рассматриваю шаблоны функций-членов с одним элементом в шаблонах классов. Чтобы понять, что я имею в виду, код приведен ниже.
// foo.h
template<typename A>
class foo {
template<typename B>
void boo(B);
};
// foo.cpp
template<typename A>
void foo<A>::boo(B value) {} // compiler error: 'Unknown' type name B
// or if I try this
template<typename B>
void foo<A>::boo(B value) {} // compiler error: Use of undeclared identifier A
Я пытаюсь использовать два имени типа, одно из шаблона класса и одно из шаблона одного файла, для этой конкретной функции. Но в этих двух версиях выше я получаю ошибки компилятора. Как бы мне обойти эту проблему?
Ответ №1:
Для определения шаблона-члена требуются оба набора параметров шаблона.
(выделение мое)
Если объявление заключающего класса, в свою очередь, является шаблоном класса, когда шаблон-член определяется вне тела класса, он принимает два набора параметров шаблона: один для заключающего класса, а другой для самого себя:
Например.
template<typename A>
template<typename B>
void foo<A>::boo(B value) {}
Комментарии:
1. @MAGEPAC Требуются два набора параметров шаблона; один для шаблона класса, другой для шаблона функции-члена. Один набор, содержащий два параметра шаблона, подобных
<typename A, typename B>
, не подходит для этого.2. Ваш будет означать один шаблон с двумя параметрами шаблона, другой — вложенный шаблон.