Я искал в Интернете и не нашел никакого объяснения, почему происходит следующее.
Например, есть шаблон класса Enclosing с вложенным классом Nested.
В классе Enclosing есть метод, который должен создать экземпляр класса Nested и использовать его поля и методы.
В следующем коде есть модель того, как я пытаюсь это сделать:
template<typename T, typename S>
class Enclosing{
public:
class Nested;
Nested foo();
};
template<typename T, typename S>
class Enclosing<T,S>::Nested{
public:
T field;
void some_method();
friend class Enclosing; // instead of this line I also tried:
// friend class Enclosing<T,S>
// and it didn't work either
};
template<typename T, typename S>
typename Enclosing<T,S>::Nested Enclosing<T,S>::foo (){
Nested nes;
nes.some_method; // the problem appears here
return enc;
}
Проблема в:
Когда я пишу nes.some_method
ни одна из сред, которые я пробовал (VS2010, eclipse), после того, как я набрал «nes.», не предлагает мне никаких вариантов. Мне кажется, что «нет» вообще не является инстансом класса.
Как получить доступ к методам и полям вложенного класса из вложенного шаблона?
Эта строка:
Nested nes();
Не создает объект типа nes
, скорее объявляет функцию который не принимает аргументов и возвращает объект типа Nested
, Я подозреваю, что это источник вашей проблемы, а не friend
декларация. Просто удалите пару скобок после nes
:
Nested nes;
Кроме того, в C ++ 11 вы можете сделать:
Nested nes{};
РЕДАКТИРОВАТЬ:
После исправления вышеуказанной ошибки кажется, что ваша программа не компилируется & ссылка правильно — сомнительно из-за той же проблемы. Из вашего кода я могу сказать, что определение some_method()
функция-член по-прежнему отсутствует, и это может стать причиной того, что компоновщик откажется от создания исполняемого файла для вашей программы.
Вот:
Nested nes();
Вы не вызываете конструктор по умолчанию Nested
а скорее объявив функцию с именем nes
который принимает 0 аргументов и возвращает по значению экземпляр Nested
учебный класс. Это называется Most Vexing Parse. Удалите параметры, чтобы код работал правильно.
Вот рабочая демонстрация.