C++ 无法从模板基类导入typedefs
这个问题不是重复的,而是后续问题 作为继承typedef的一种解决方案,有人建议使用using将它们导入派生类,而简单地使用typename Base::typedef_typed就足够了 以下代码主要取自: MVC错误消息:C++ 无法从模板基类导入typedefs,c++,templates,inheritance,typedef,using,C++,Templates,Inheritance,Typedef,Using,这个问题不是重复的,而是后续问题 作为继承typedef的一种解决方案,有人建议使用using将它们导入派生类,而简单地使用typename Base::typedef_typed就足够了 以下代码主要取自: MVC错误消息: 1>C:\Work\EDPS\test_eigen\test_eigen.cpp(27): error : argument list for class template "A" is missing 1> using typename 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>
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
那怎么了?我错过什么了吗?或者,这里的注释和答案可能有误吗?只需按此修改即可
template<typename T>
class B : public A<T>
{
public:
using typename A<T>::Vec_t;
// .........
};
在C++中,如果A是模板,则独立A不是“完整”类型。您需要指定模板参数。这就是A解决它的原因。只需将其修改为
template<typename T>
class B : public A<T>
{
public:
using typename A<T>::Vec_t;
// .........
};
在C++中,如果A是模板,则独立A不是“完整”类型。您需要指定模板参数。这就是A解决它的原因。我认为混淆源于A用作基类的方式。如果类模板从带有模板参数的类模板派生,则必须完全限定基类名称。但是,如果类派生自类模板专门化,则可以使用基类名称而不使用模板参数列表
template<typename T>
struct A {
using t = T;
};
template<typename T>
struct B : A<T> {
using typename A<T>::t; // Full qualification needed -> mandatory argument list
};
struct C : A<int> {
using typename A::t; // Injected class name -> optional argument list
};
另外,请注意,t在C中直接可用,无需使用任何声明或typedef。我可能仍然有用,例如,如果C从A私有继承,但您希望t在C中公开可用。在示例中,C默认情况下公开继承,因为它是一个结构。我认为混淆源于A用作基类的方式。如果类模板从带有模板参数的类模板派生,则必须完全限定基类名称。但是,如果类派生自类模板专门化,则可以使用基类名称而不使用模板参数列表
template<typename T>
struct A {
using t = T;
};
template<typename T>
struct B : A<T> {
using typename A<T>::t; // Full qualification needed -> mandatory argument list
};
struct C : A<int> {
using typename A::t; // Injected class name -> optional argument list
};
另外,请注意,t在C中直接可用,无需使用任何声明或typedef。我可能仍然有用,例如,如果C从A私有继承,但您希望t在C中公开可用。在示例中,C默认情况下公开继承,因为它是一个结构。对低质量问题的答案进行向下投票。相反,这应该是职业训练局的一个“印刷错误”评论@AndreyPro我非常理解所问的问题,谢谢。顺便说一句,这不是关于a型名称的问题,而是关于a。对一个低质量问题的答案投反对票。相反,这应该是VTC的一个评论,称之为“印刷错误”@AndreyPro我非常理解所问的问题,谢谢。顺便说一句,这不是关于typename a,而是关于a。使用typename a::Vec\t;编译器的错误非常简单:在需要的地方使用的是没有参数列表的。我认为这不是输入错误。打字错误是作者知道但输入错误的东西。在这里我想作者没有意识到typename A和typename A是不同的。有人努力阅读链接的线程吗??整个问题之所以出现,是因为有人建议使用typename A::Vec\t;应该足够了。代码也是从那里复制的。@AndreyPro答案是错误的。我留下了一个使用typename a::Vec\t;编译器的错误非常简单:在需要的地方使用的是没有参数列表的。我认为这不是输入错误。打字错误是作者知道但输入错误的东西。在这里我想作者没有意识到typename A和typename A是不同的。有人努力阅读链接的线程吗??整个问题之所以出现,是因为有人建议使用typename A::Vec\t;应该足够了。代码也是从那里复制的。@AndreyPro答案是错误的。我留下了一个