#c #templates #forward-declaration
#c #шаблоны #прямое объявление
Вопрос:
Это прямое объявление Mappings
класса:
template<typename Type, typename IDType=typename Type::IDType>
class Mappings;
template<typename Type, typename IDType>
class Mappings
{
public:
...
Type valueFor(const IDTypeamp; id);
...
};
Как я могу переслать объявление valueFor
функции?
Мне нужно что-то вроде
template<typename Type, typename IDType>
Type Mappings::valueFor(const IDTypeamp; id)
{
// return value
}
Комментарии:
1. Невозможно перенаправить объявление только одной функции-члена, вам нужно само определение класса. Возможно, вы могли бы изменить свой код так, чтобы он не был нужен?
2. Я обновил вопрос. Возможно ли это сейчас?
3. Если он содержит
{ ... }
, то это определение функции, а не прямое объявление. Я не понимаю вопроса.4. @melpomene: я хочу поместить первую часть в файл заголовка, а вторую часть — во встроенный файл. Поэтому я должен сначала объявить функцию, а потом реализовать ее.
5. Что вы подразумеваете под «встроенным файлом»?
Ответ №1:
Как уже указывалось в комментариях выше, невозможно перенаправить объявление только одной функции-члена класса. Если то, что вы на самом деле ищете, — это способ определения вашей функции-члена вне класса:
template <typename Type, typename IDType = typename Type::IDType>
class Mappings;
template <typename Type, typename IDType>
class Mappings
{
public:
Type valueFor(const IDTypeamp; id);
};
template <typename Type, typename IDType>
Type Mappings<Type, IDType>::valueFor(const IDTypeamp; id)
{
return {};
}
<a rel="noreferrer noopener nofollow" href="https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(j:1,lang:c++,source:'template
class Mappings;
template
class Mappings
{
public:
Type valueFor(const IDType& id);
};
template
Type Mappings::valueFor(const IDType& id)
{
return {};
}
‘),l:’5′,n:’0′,o:’C++ source #1′,t:’0′)),k:50,l:’4′,n:’0′,o:»,s:0,t:’0′),(g:!((h:compiler,i:(compiler:g83,filters:(b:’0′,binary:’1′,commentOnly:’0′,demangle:’0′,directives:’0′,execute:’1′,intel:’0′,libraryCode:’1′,trim:’1′),lang:c++,libs:!(),options:»,source:1),l:’5′,n:’0′,o:’x86-64 gcc 8.3 (Editor #1, Compiler #1) C++’,t:’0′)),k:50,l:’4′,n:’0′,o:»,s:0,t:’0′)),l:’2′,n:’0′,o:»,t:’0′)),version:4″ rel=»nofollow noreferrer»>живой пример здесь
Обратите внимание, что имя класса перед ::
должно включать аргументы шаблона. В определении функции-члена вне определения класса имя должно быть дополнено именем класса [class.mfct]/4, за которым ::
следует. Mappings
это имя шаблона класса, а не имя класса. Хотя внутри определения шаблона класса имя шаблона может использоваться как синоним имени класса [temp.local]/1, мы не находимся внутри определения какого-либо шаблона в точке, где вводится определение этой функции-члена. Таким образом, вам нужно использовать правильное имя класса там…