gpt4 book ai didi

c++ - 从派生类访问模板基类的构造函数

转载 作者:太空狗 更新时间:2023-10-29 20:34:04 26 4
gpt4 key购买 nike

请考虑以下场景:
1) 参数化基类 A
2) 从 A 派生的参数化派生类 B

当派生类的构造函数试图引用基类时,会发生编译错误:

/** Examines how to invoke the Base class ctor
from the Derived class,
when both classes are templates.
*/

#include <iostream>

using namespace std;


template<typename T>
class A /// base class
{
public:
A(int i)
{
}
};


template<typename T>
class B : public A<T> /// derived class
{
public:
B(int i) :
A {i}
{
}
};


int main()
{
A<int> a {5};
B<int> b {10};
}


错误:

\main.cpp||In constructor 'B<T>::B(int)':|
\main.cpp|26|error: class 'B<T>' does not have any field named 'A'|

\main.cpp||In instantiation of 'B<T>::B(int) [with T = int]':|
\main.cpp|35|required from here|
\main.cpp|26|error: no matching function for call to 'A<int>::A()'|

\main.cpp|26|note: candidates are:|
\main.cpp|15|note: A<T>::A(int) [with T = int]|
\main.cpp|15|note: candidate expects 1 argument, 0 provided|
\main.cpp|12|note: constexpr A<int>::A(const A<int>&)|
\main.cpp|12|note: candidate expects 1 argument, 0 provided|
\main.cpp|12|note: constexpr A<int>::A(A<int>&&)|
\main.cpp|12|note: candidate expects 1 argument, 0 provided|
||=== Build failed: 2 error(s), 2 warning(s) (0 minute(s), 0 second(s)) ===|


编译器将 B 类的构造函数解释为初始化 B 类中的字段 A,而不是调用 A 类的构造函数。

如何解决这个问题?

最佳答案

基类的名称,在B<T> 中使用时的构造函数,是一个从属名称,因为它指的是什么取决于模板参数 T .参见 https://en.cppreference.com/w/cpp/language/dependent_name .

名称查找规则不同。如果名称依赖于当前范围 ( B<T> ) 的模板参数,则名称在当前范围内不可用(即 T 的构造函数)。

在这种情况下,需要在 B 中指定完整的全名:

template<typename T>
class B : public A<T> /// derived class
{
public:
B(int i) :
A<T> {i}
{
}
};

在派生类中访问基类的成员时也是如此,例如需要这样做:

template<typename T>
class B : public A<T>
{
public:
void f()
{
A<T>::g(); // defined in A
}
};

在那种情况下this->g()确实也有效,但它可以有不同的含义。

将基类的 typedef 定义为 B<T> 的成员可能很有用,例如:

class B : public A<T>         /// derived class
{
using base = A<T>;
public:
B(int i) :
base {i}
{
}
};

那么基类的模板参数只需要在代码中重复一次。

关于c++ - 从派生类访问模板基类的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51172302/

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