gpt4 book ai didi

c++ - 无法从模板基类导入 typedef

转载 作者:行者123 更新时间:2023-11-30 01:35:50 60 4
gpt4 key购买 nike

这个问题不是重复的,而是跟进 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

那怎么了?我错过了什么吗?或者那里的评论和答案可能有误??

最佳答案

我认为混淆来自 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
};

Live on Coliru

另外,请注意 tC 中可用直接,没有任何 using 声明或 typedef。我可能仍然有用,例如如果 C继承自 A<int>私下里,但你想要tC 中公开提供(在示例中,C 默认公开继承,因为它是一个 struct )。

关于c++ - 无法从模板基类导入 typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53175076/

60 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com