Определение шаблона класса-члена C++ в контексте пространства имен с параметром шаблона, который является частным в клас ⇐ C++
-
Anonymous
Определение шаблона класса-члена C++ в контексте пространства имен с параметром шаблона, который является частным в клас
Я хочу определить шаблон класса-члена C++ в контексте пространства имен. Шаблон класса-члена и тип, используемый параметром для этого шаблона, объявляются закрытыми в классе, содержащем шаблон члена. Компилятор жалуется, что тип параметра шаблона объявлен закрытым.
Когда я использую g++ (GCC) 13.2.0 для компиляции следующего кода в файле temp.cc
// следующее определение класса будет помещено в отдельный файл заголовка класс А { public: // Я не хочу объявлять структуру S публичной частный: структура Н; шаблон struct S; // Я не хочу определять здесь структуру S! }; // следующее определение будет помещено в отдельный файл template struct A::S { }; Я получаю следующую ошибку
g++ temp.cc temp.cc:9:19: ошибка: «struct A::N» является частной в этом контексте 9 | template struct A::S { | ^ temp.cc:5:10: примечание: здесь объявлено как личное 5 | структура Н; | ^ Есть ли способ успокоить компилятор без объявления struct N общедоступной?
Обратите внимание, что определение struct N в частной области класса A компилируется нормально
класс A { публика: частный: структура Н; шаблон struct S {}; // нет ошибки компиляции! }; Следовательно, проблема в том, что поведение компилятора кажется непоследовательным: struct A::S разрешено использовать struct N* в качестве параметра шаблона, когда struct A::S определена в области класса A, но не тогда, когда она определена в области пространства имен. Почему бы и нет?
Я хочу определить шаблон класса-члена C++ в контексте пространства имен. Шаблон класса-члена и тип, используемый параметром для этого шаблона, объявляются закрытыми в классе, содержащем шаблон члена. Компилятор жалуется, что тип параметра шаблона объявлен закрытым.
Когда я использую g++ (GCC) 13.2.0 для компиляции следующего кода в файле temp.cc
// следующее определение класса будет помещено в отдельный файл заголовка класс А { public: // Я не хочу объявлять структуру S публичной частный: структура Н; шаблон struct S; // Я не хочу определять здесь структуру S! }; // следующее определение будет помещено в отдельный файл template struct A::S { }; Я получаю следующую ошибку
g++ temp.cc temp.cc:9:19: ошибка: «struct A::N» является частной в этом контексте 9 | template struct A::S { | ^ temp.cc:5:10: примечание: здесь объявлено как личное 5 | структура Н; | ^ Есть ли способ успокоить компилятор без объявления struct N общедоступной?
Обратите внимание, что определение struct N в частной области класса A компилируется нормально
класс A { публика: частный: структура Н; шаблон struct S {}; // нет ошибки компиляции! }; Следовательно, проблема в том, что поведение компилятора кажется непоследовательным: struct A::S разрешено использовать struct N* в качестве параметра шаблона, когда struct A::S определена в области класса A, но не тогда, когда она определена в области пространства имен. Почему бы и нет?
Мобильная версия