Я не могу получить это для компиляции вообще. Возможно, я не могу, но я не знаю, почему этого не должно быть.Объявление экземпляра явной специализации шаблона в регулярном классе
class A {
template <typename T>
class B {
int test() { return 0; }
};
//template <> class B<int>; <-with this, namepace error
B<int> myB_;
};
template <> class A::B<int> {
int test() {
return 1;
}
};
Как представляется, компилятор жалуется на «Явная специализация„класса A :: B“должен быть объявлен до его использования.» Если я попытаюсь предоставить объявление froward в комментариях, компилятор жалуется «Явная специализация« B »должна быть объявлена в пространстве имен, содержащем шаблон». Здесь мы используем 2 разных компилятора. Эта ошибка связана с компилятором IBM x1 в AIX, но при компиляции на наших системах Sun я получаю подобные ошибки с разными вариантами. Похоже на уловку-22.
Очевидно, что это очень надуманный, упрощенный пример, но он представляет проблему. Я хочу определить класс шаблона внутри класса, потому что класс шаблона относится только к содержащемуся классу. Не должно быть доступа к шаблону вне класса.
Я что-то упустил?
Используйте четыре пробела для ввода кода (или выберите код и нажмите Ctrl + K). –
Это не должно компилироваться, поскольку мы видим это даже без специализаций. Но это потому, что были удалены сайтом, запутывающим их с помощью HTML-тегов. Пожалуйста, выберите разделы кода и отметьте их как таковые, используя кнопку панели инструментов «101010» при публикации - это будет сохранять код в точности так, как есть. В противном случае специализация вне содержащего класса в порядке в соответствии со стандартом. Но, пожалуйста, восстановите недостающие части кода, чтобы обсуждение было эффективным. –
usta
В ситуации, когда у вас есть с myB_, вы можете использовать идиом PIMPL, чтобы не требовать B в этот момент. –
usta