Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法从模板基类导入typedefs_C++_Templates_Inheritance_Typedef_Using - Fatal编程技术网

C++ 无法从模板基类导入typedefs

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

这个问题不是重复的,而是后续问题

作为继承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::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答案是错误的。我留下了一个