На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: JoeUser, Qraizer, Hsilgos
  
> Полная специализация шаблона, объявленного в protected секции класса, gcc дает ошибку, почему и как сделать правильно.
    Что-то я запутался. Имеется шаблон a. Хочу использовать его специализацию внутри класса b. Снаружи эта специализация не нужна, поэтому спрятал ее в protected-секцию класса.
    ExpandedWrap disabled
      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 ругается
    ExpandedWrap disabled
      error: 'using aa = class a<100>' is protected within this context
       void b::aa::func()
            ^
    Если перенести using в public-секцию, то все компилируется, но мое чуство прекрасного возражает против "свечения" aa наружу.

    Вопрос первый: в чем криминал?
    Вопрос второй: а как сделать правильно?
      Цитата Dushevny @
      Что-то я запутался. Имеется шаблон a. Хочу использовать его специализацию внутри класса b. Снаружи эта специализация не нужна, поэтому спрятал ее в protected-секцию класса.

      Что то я тоже запутался в твоем коде. У тебя класс "b" не наследуется от класса "a", при этом ты хочешь специализировать a::func внутри b. Тут явно где то подвох. Тебе нужно класс a специализировать в глобальном пространстве имен. Такой код очень сильно запутывает.
      Почему не написать както так?
      ExpandedWrap disabled
            template <int i>
            class a
            {
            public:
                void func();
            };
         
            template <>
            class a<100>
            {
            public:
                void func();
            };
            
            class b
            {
            protected:
                using aa = a<100>;
                aa A;
            };
        Цитата Dushevny @
        Имеется шаблон a. Хочу использовать его специализацию внутри класса b. Снаружи эта специализация не нужна, поэтому спрятал ее в protected-секцию класса.
        Ты не специализировал a<> в b, ты объявил там алиас шаблона.
        Цитата Dushevny @
        На определение специализации template<> void b::aa::func() gcc ругается
        Ты специализировал не класс, а его метод. При этом использовал защищённое имя. Ты можешь использовать a<100>::func() где угодно, т.к. он публичный метод шаблонного класса, однако в определении его специализации участвует защищённое имя b::aa, недоступное за пределами b. Какой реакции ты ожидал от компилятора?
        Специализируй вот так
        ExpandedWrap disabled
          template<>
          void a<100>::func()
          {
           
          }
        и оно будет работать. Отсюда вопрос: чего именно ты хотел достичь?
        Сообщение отредактировано: Qraizer -
        Одни с годами умнеют, другие становятся старше.
          Я хотел использовать a<100> внутри b. Поскольку 100 - число, которое может впоследствии измениться, чтобы не менять его при необходимости в разных местах (рискуя где-то забыть поменять), я дал a<100> новое имя. Поскольку a<100> используется только внутри b, я это новое имя aa объявил внутри b. После этого я хочу написать специализацию func для b::aa. В чем тут криминал? Я бы понял, если бы я пытался вызвать b::aa::func() извне b, но почему ошибкой является определение функции?
            Цитата Dushevny @
            После этого я хочу написать специализацию func для b::aa.
            Пиши, кто тебе не даёт.
            b не является хозяином a<>, поэтому, создав специализацию a<> или его части, он не будет является её хозяином также. Воспользоваться этой специализацией может каждый, а не только b. Так что доступ к имени b::aa должен быть публичным.
            Сообщение отредактировано: Qraizer -
            Одни с годами умнеют, другие становятся старше.
            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script Execution time: 0,0815 ]   [ 15 queries used ]   [ Generated: 21.11.19, 08:35 GMT ]