Прямое объявление функции-члена шаблонного класса

#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, мы не находимся внутри определения какого-либо шаблона в точке, где вводится определение этой функции-члена. Таким образом, вам нужно использовать правильное имя класса там…