Этот вопрос не является дубликатом, но является следствием Распространение 'typedef' от основанного до производного класса для 'template'
В качестве решения для наследования typedefs было предложено использовать using
для импорта их в производный класс, тогда как простого using typename Base::typedefed_type
должно быть достаточно.
Следующий код в основном взят из Ответ Романа Круглова :
#include <vector>
template<typename T>
class A
{
public:
typedef std::vector<T> Vec_t;
};
template<typename T>
class B : public A<T>
{
public:
using typename A::Vec_t;
// .........
private:
Vec_t v;
};
int main()
{
B<int> bb;
}
Однако он не компилируется, потому что компиляторы очень хотят, чтобы аргументы шаблона были A
.
Сообщение об ошибке компилятора Intel:
1>C:\Work\EDPS\test_eigen\test_eigen.cpp(27): error : argument list for class template "A" is missing
1> using typename A::Vec_t;
1> ^
1> detected during instantiation of class "B<T> [with T=int]" at line 34
1>
1>C:\Work\EDPS\test_eigen\test_eigen.cpp(31): error : identifier "Vec_t" is undefined
1> Vec_t v;
1> ^
1> detected during instantiation of class "B<T> [with T=int]" at line 34
1>
MVC Сообщение об ошибке:
c:\work\edps\test_eigen\test_eigen.cpp(27): error C2955: 'A': use of class template requires template argument list
1>c:\work\edps\test_eigen\test_eigen.cpp(17): note: see declaration of 'A'
1>c:\work\edps\test_eigen\test_eigen.cpp(32): note: see reference to class template instantiation 'B<T>' being compiled
1>c:\work\edps\test_eigen\test_eigen.cpp(27): error C3210: 'A': a member using-declaration can only be applied to a base class member
1>c:\work\edps\test_eigen\test_eigen.cpp(32): warning C4624: 'B<int>': destructor was implicitly defined as deleted
Так что не так? Я что-то пропустил? Или, возможно, комментарии и ответы там неправильные ??