Предположим, файл заголовка myheader.hxx
определяет шаблон класса A
в котором не шаблонный класс B
определяется (это не зависит от параметра шаблона A
):
template<class T>
class A {
class B {
// ...
};
};
Это нормально в этом случае реализовать B
в myheader.hxx
или мне нужно написать отдельный myheader.cxx
избежать дублирования определений во время ссылки? Этот случай последовательно обрабатывается разными компиляторами?
Это все еще либо шаблон (или часть шаблона, не знаю сверхточных определений), даже если это не шаблон верхнего уровня, так что вы нужно следует реализовать его в заголовке (технически, он может быть в исходном файле, если это единственное место, где он используется, но это, вероятно, противоречит цели).
Примечание: если вы не собираетесь реализовывать его функции-члены в соответствии с определением класса, вам нужен следующий синтаксис:
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% уверен, что это стандартное поведение) … Я уверен, что какой-то языковой адвокат сможет объяснить, почему 🙂
И т.п.
Других решений пока нет …