我有我從兩個不同的基類派生一個類,它們都具有相同名稱的靜態函數。C++多繼承靜態函數調用歧義
爲了解決這個歧義,我試圖使用範圍操作符 - 就像我爲成員函數做的那樣。但是,這不會編譯。 爲什麼?錯誤的語法?
我想通過派生類型名稱調用靜態函數,而不是直接通過基類名稱。其實我希望避免這種情況,但我不知道如何去做。
錯誤在下面還代碼(註釋掉)發生時,當我離開模板遠:
#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;
}
看起來您正在尋找某種模板專業化。 說「我想要什麼」的行沒有任何意義。你想讓它打什麼? – CashCow
那麼,如果我有一個成員函數的範圍操作符是:obj.StaticBaseB ::宣佈() - 我想要的但沒有對象。 –
我的答案是否在下面的工作(更改公開在基類模板中保護) – CashCow