【发布时间】:2014-01-29 14:57:04
【问题描述】:
我从两个不同的基类派生一个类,这两个基类都有一个同名的静态函数。
为了解决这种歧义,我尝试使用范围运算符 - 就像我对成员函数所做的那样。但是,这不会编译。 为什么?语法错误?
我想通过派生类型名而不是直接通过基类名调用静态函数。其实我更想阻止这种情况,但我不知道该怎么做。
当我离开模板时,以下代码中的错误(已注释掉)也会发生:
#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;
}
【问题讨论】:
-
看起来您正在寻找某种模板专业化。说“我想要什么”的那句话没有真正的意义。你想让它叫什么?
-
好吧,如果我有一个成员函数,范围运算符将是:obj.StaticBaseB
::announce() - 我想要那个但没有对象。 -
我下面的答案是否有效(在基类模板中将 public 更改为 protected)
标签: c++ templates multiple-inheritance