Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.119.123.32] |
|
Сообщ.
#1
,
|
|
|
Что-то я запутался. Имеется шаблон a. Хочу использовать его специализацию внутри класса b. Снаружи эта специализация не нужна, поэтому спрятал ее в protected-секцию класса.
template <int i> class a { public: void func(); }; class b { protected: using aa = a<100>; aa A; }; template<> void b::aa::func() { } На определение специализации template<> void b::aa::func() gcc ругается error: 'using aa = class a<100>' is protected within this context void b::aa::func() ^ Вопрос первый: в чем криминал? Вопрос второй: а как сделать правильно? |
Сообщ.
#2
,
|
|
|
Цитата Dushevny @ Что-то я запутался. Имеется шаблон a. Хочу использовать его специализацию внутри класса b. Снаружи эта специализация не нужна, поэтому спрятал ее в protected-секцию класса. Что то я тоже запутался в твоем коде. У тебя класс "b" не наследуется от класса "a", при этом ты хочешь специализировать a::func внутри b. Тут явно где то подвох. Тебе нужно класс a специализировать в глобальном пространстве имен. Такой код очень сильно запутывает. Почему не написать както так? template <int i> class a { public: void func(); }; template <> class a<100> { public: void func(); }; class b { protected: using aa = a<100>; aa A; }; |
Сообщ.
#3
,
|
|
|
Цитата Dushevny @ Ты не специализировал a<> в b, ты объявил там алиас шаблона.Имеется шаблон a. Хочу использовать его специализацию внутри класса b. Снаружи эта специализация не нужна, поэтому спрятал ее в protected-секцию класса. Цитата Dushevny @ Ты специализировал не класс, а его метод. При этом использовал защищённое имя. Ты можешь использовать a<100>::func() где угодно, т.к. он публичный метод шаблонного класса, однако в определении его специализации участвует защищённое имя b::aa, недоступное за пределами b. Какой реакции ты ожидал от компилятора?На определение специализации template<> void b::aa::func() gcc ругается Специализируй вот так template<> void a<100>::func() { } |
Сообщ.
#4
,
|
|
|
Я хотел использовать a<100> внутри b. Поскольку 100 - число, которое может впоследствии измениться, чтобы не менять его при необходимости в разных местах (рискуя где-то забыть поменять), я дал a<100> новое имя. Поскольку a<100> используется только внутри b, я это новое имя aa объявил внутри b. После этого я хочу написать специализацию func для b::aa. В чем тут криминал? Я бы понял, если бы я пытался вызвать b::aa::func() извне b, но почему ошибкой является определение функции?
|
Сообщ.
#5
,
|
|
|
Цитата Dushevny @ Пиши, кто тебе не даёт.После этого я хочу написать специализацию func для b::aa. b не является хозяином a<>, поэтому, создав специализацию a<> или его части, он не будет является её хозяином также. Воспользоваться этой специализацией может каждый, а не только b. Так что доступ к имени b::aa должен быть публичным. |