Вложенные C ++ шаблоны классов - PullRequest
0 голосов
/ 29 мая 2018

Как я могу вернуть тип "B", используя метод класса "A"?Например:

template <typename T> class A{

    //something

        template <typename V> class B{

        //something

        };

    B& foo(){
        B<T> y; //the variable must have the same type T of the father class (for my exercise)
        //something
        return y;
    }
};

main:

A <int> o;
o.foo();

Когда я пытаюсь его скомпилировать, выдает следующие ошибки:

"недопустимое использование имени шаблона"A :: B 'без списка аргументов "at" B & foo () ... "

и

"' класс A 'не имеет члена с именем' foo '"

Я написал функцию "foo" после закрытия класса B, так что это может быть правильно ...

1 Ответ

0 голосов
/ 29 мая 2018

У вашего кода три проблемы:

  1. Отсутствует спецификатор доступа public.foo() не будет доступен за пределами class A, в противном случае.
  2. Также необходимо добавить аргументы шаблона в возвращаемый тип, то есть объявить функцию-член как B<T> foo().Более того, пусть компилятор определяет тип возвращаемого значения (работает с C ++ 14 и более поздними версиями), поэтому просто напишите auto foo()
  3. Вы возвращаете ссылку на локальную переменную, что приводит к неопределенному поведению.Просто верните локальную переменную в качестве значения, поскольку copy elision вам не нужно беспокоиться о проблемах с производительностью.

Учитывая это, вашкод должен работать.

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