【发布时间】:2018-11-06 15:34:51
【问题描述】:
这个问题不是重复的而是跟进 Propagating 'typedef' from based to derived class for 'template'
作为继承typedef的解决方案,建议使用using将它们导入派生类,而简单的using typename Base::typedefed_type应该就足够了。
以下代码大部分取自Roman Kruglov's answer:
#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 的模板参数。
英特尔编译器错误信息:
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
那怎么了?我错过了什么吗?还是那里的 cmets 和答案错了??
【问题讨论】:
-
using typename A<T>::Vec_t; -
编译器错误非常简单:您使用的
A没有在需要的地方提供参数列表。 -
我认为这不是一个错字。错字是作者知道但打错的东西。这里我想作者没有意识到 typename A 和 typename A
是不同的。 -
有人努力阅读链接的线程吗?出现了整个问题,因为有人建议
using typename A::Vec_t;就足够了。代码也是从那里复制过来的。 -
@AndreyPro 答案是错误的。我留下了comment
标签: c++ templates inheritance typedef using