2016-10-16 5 views
2

У меня есть следующая проблема:класс экземпляра в вложенных классов

template< typename T, size_t N, size_t... N_i > 
struct A 
{ 
    // nested class 
    template< typename... Ts > 
    class B 
    { 
     //... 

     A<T, N_i...>::B<Ts...> operator[](size_t i) 
     { 
     A< T, N_i...>::B<Ts...> res{ /* ... */ }; 

     return res; 
     } 

     // ... 
    }; 
}; 

К сожалению, компилятор дает ошибку для «A < T, N_i...>::B <Ts...> res{ /* ... */ };». Кто-нибудь знает, как я могу вернуть экземпляр class B (который отличается в аргументах шаблона его внешнего class A) в функции «operator[]» от class B?

Большое спасибо заранее.

ответ

2

Должно быть достаточно добавить typename перед A<T, N_i...> и template перед тем B<Ts...>.

Я имею в виду

template< typename T, size_t N, size_t... N_i > 
struct A 
{ 
    // nested class 
    template< typename... Ts > 
    class B 
    { 
     //... 

     typename A<T, N_i...>::template B<Ts...> operator[](size_t i) 
     { 
     typename A< T, N_i...>::template B<Ts...> res{ /* ... */ }; 

     return res; 
     } 

     // ... 
    }; 
} 

P.s .: должны также работать с C++ 11; не только с C++ 14

2

Ввод typename перед тем, как полный тип типов возвращаемых данных - это то, что исправляет ошибки, которые вы получаете. Однако не ставьте параметры шаблона после B, поскольку B всегда ссылается на «текущую» инстанцировку типа.

#include <stdio.h> 
using namespace std; 

template< typename T, size_t N, size_t... N_i > 
struct A 
{ 
    // nested class 
    template< typename... Ts > 
    class B 
    { 
     //... 

     typename A<T, N_i...>::B operator[](size_t i) 
     { 
     typename A< T, N_i...>::B res{ /* ... */ }; 

     return res; 
     } 

     // ... 
    }; 
}; 

https://godbolt.org/g/hsB4pW

+0

извините, но я не уверен, что понял; 'operator []' в вашем ответе возвращает что? 'A :: B ' или 'A :: B '? Если я правильно понимаю, OP запросит 'A :: B ' – max66

+0

еще раз: с «Помещение пространства имен до полного типа» вы имеете в виду «Помещение« typename »перед полным типом? – max66

+0

@ max66 еще раз спасибо. – xaxxon

Смежные вопросы