Могут ли не шаблонные вложенные классы шаблонов классов быть реализованы в заголовке C ++?

Предположим, файл заголовка myheader.hxx определяет шаблон класса A в котором не шаблонный класс B определяется (это не зависит от параметра шаблона A):

template<class T>
class A {
class B {
// ...
};
};

Это нормально в этом случае реализовать B в myheader.hxxили мне нужно написать отдельный myheader.cxx избежать дублирования определений во время ссылки? Этот случай последовательно обрабатывается разными компиляторами?

1

Решение

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

Примечание: если вы не собираетесь реализовывать его функции-члены в соответствии с определением класса, вам нужен следующий синтаксис:

template<typename T>
void A<T>::B::foo(...)
{
// ...
}

Кроме того, потому что это придумано раньше, если B случилось, что имеет свой собственный параметр шаблона, это будет что-то вроде:

template<typename T>
template<typename T2>
void A<T>::B<T2>::foo(...)
{
// ...
}

Не:

template<typename T, typename T2>
void A<T>::B<T2>::foo(...)
{
// ...
}

Или если B не но B::foo сделал, это было бы:

template<typename T>
template<typename T2>
// void A<T>::B::foo<T2>(...) // not this apparently
void A<T>::B::foo(...)
{
// ...
}

РЕДАКТИРОВАТЬ: видимо это foo выше вместо foo<T2> для функции, по крайней мере, с GCC (так что почти на 100% уверен, что это стандартное поведение) … Я уверен, что какой-то языковой адвокат сможет объяснить, почему 🙂

И т.п.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]