gpt4 book ai didi

C++多重继承静态函数调用歧义

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:24:26 28 4
gpt4 key购买 nike

我有这样的情况,我从两个不同的基类派生一个类,这两个基类都有一个同名的静态函数。

为了解决这种歧义,我尝试使用作用域运算符——就像我对成员函数所做的那样。但是,这不会编译。 <强>为什么?语法错误?

我想通过派生类型名称而不是直接通过基类名称调用静态函数。其实我更想避免这种情况,但我不知道该怎么做。

当我离开模板时,下面代码中的错误(已注释掉)也会发生:

#include <iostream>

template<class TDerived>
class StaticBaseA
{
public:
static void announce()
{
std::cout << "do something" << std::endl;
}
};

template<class TDerived>
class StaticBaseB
{
public:
static void announce()
{
std::cout << "do something else" << std::endl;
}
};

class Derived :
public StaticBaseA<Derived>
, public StaticBaseB<Derived>
{
using StaticBaseA<Derived>::announce;
};

class NonDerived {};

int main(int argc, char* argv[])
{
Derived::announce();
// What I want:
//Derived::StaticBaseB<Derived>::announce(); Error: "Undefined symbol 'StaticBaseB'

// What works, but what I don't want ...
StaticBaseB<Derived>::announce();

// ... because I would like to prevent this (however this is done):
StaticBaseB<NonDerived>::announce();


return 0;
}

最佳答案

制作“公告”protectedStaticBaseAStaticBaseB可能正在做你想做的事。

然后您无法调用 StaticBaseB<NonDerived>::announce来自 main,因为它将无法访问。您可以从派生自 StaticBaseB 的类中调用它。

换句话说:

template<class TDerived>
class StaticBaseA
{
protected:
static void announce()
{
std::cout << "do something" << std::endl;
}
};

template<class TDerived>
class StaticBaseB
{
protected:
static void announce()
{
std::cout << "do something else" << std::endl;
}
};

在 Derived 中,您必须向公众宣传“宣布”。

class Derived : public StaticA<Derived>, public StaticB<Derived >
{
public:
using StaticA<Derived>::announce;
};

int main()
{
Derived::announce(); // legal and calls StaticBaseA::announce
NotDerived::announce(); // no such function
StaticBaseA< Derived >::announce(); // not accessible
StaticBaseB< Derived >::announce(); // also not accessible
StaticBaseA< NotDerived >::announce(); // not accessible
StaticBaseB< NotDerived >::announce(); // also not accessible
}

关于C++多重继承静态函数调用歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21434670/

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