Как получить доступ к методам и полям вложенного класса из вложенного шаблона?

Я искал в Интернете и не нашел никакого объяснения, почему происходит следующее.

Например, есть шаблон класса 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.», не предлагает мне никаких вариантов. Мне кажется, что «нет» вообще не является инстансом класса.

Как получить доступ к методам и полям вложенного класса из вложенного шаблона?

1

Решение

Эта строка:

Nested nes();

Не создает объект типа nes, скорее объявляет функцию который не принимает аргументов и возвращает объект типа Nested, Я подозреваю, что это источник вашей проблемы, а не friend декларация. Просто удалите пару скобок после nes:

Nested nes;

Кроме того, в C ++ 11 вы можете сделать:

Nested nes{};

РЕДАКТИРОВАТЬ:

После исправления вышеуказанной ошибки кажется, что ваша программа не компилируется & ссылка правильно — сомнительно из-за той же проблемы. Из вашего кода я могу сказать, что определение some_method() функция-член по-прежнему отсутствует, и это может стать причиной того, что компоновщик откажется от создания исполняемого файла для вашей программы.

5

Другие решения

Вот:

Nested nes();

Вы не вызываете конструктор по умолчанию Nested а скорее объявив функцию с именем nes который принимает 0 аргументов и возвращает по значению экземпляр Nested учебный класс. Это называется Most Vexing Parse. Удалите параметры, чтобы код работал правильно.

Вот рабочая демонстрация.

0

По вопросам рекламы [email protected]