Вывод типа из родительского класса из вложенного класса - PullRequest
1 голос
/ 03 сентября 2011

У меня проблема с выводом типов в Visual Studio 2010. Мне нужно сделать что-то вроде этого:

class Outer {
    template<typename T> ... SomeTemplateFunction() { ... }
    class NestedClass {
        std::vector<decltype(SomeTemplateFunction<SomeOtherType>())> stuff;
    };
};

Однако даже после корректировки нестатичности метода

class Outer {
    static Outer* null() { return nullptr; }
    template<typename T> ... SomeTemplateFunction() { ... }
    class NestedClass {
        std::vector<decltype(Outer::null()->SomeTemplateFunction<SomeOtherType>())> stuff;
    };
};

Visual Studio плачет, говоря, что внешний класс является неполным типом.Как я могу изменить приведенный выше фрагмент кода для вывода на тип возвращаемого значения функции шаблона внешнего класса?

1 Ответ

1 голос
/ 03 сентября 2011

Вы можете определить вложенный класс позже

class Outer {
    static Outer* null() { return nullptr; }
    template<typename T> ... SomeTemplateFunction() { ... }
    class NestedClass;
};

class Outer::NestedClass {
    std::vector<decltype(Outer::null()->SomeTemplateFunction<SomeOtherType>())> stuff;
};

Компилятор вправе стонать на вас. Для доступа члена класса (. и ->), в отличие от ::, класс должен быть завершен. Так что, если это будет статическая функция, это будет хорошо, но, поскольку это нестатическая функция-член, она выдает ошибку.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...