2014-01-29 24 views
2

我有我從兩個不同的基類派生一個類,它們都具有相同名稱的靜態函數。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; 
} 
+0

看起來您正在尋找某種模板專業化。 說「我想要什麼」的行沒有任何意義。你想讓它打什麼? – CashCow

+0

那麼,如果我有一個成員函數的範圍操作符是:obj.StaticBaseB ::宣佈() - 我想要的但沒有對象。 –

+0

我的答案是否在下面的工作(更改公開在基類模板中保護) – CashCow

回答

1

製作「宣佈」在StaticBaseAprotectedStaticBaseB可能是部分的方式做你想要什麼。

然後,您不能從main調用StaticBaseB<NonDerived>::announce,因爲它無法訪問。你可以從派生自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; 
    } 
}; 

派生你必須提倡 「公佈」 公衆。

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 
} 
+0

是的,但是我不能再訪問Derived :: announce()。 –

+0

讓它公開然後 – CashCow

+0

要讓基類的'announce()'受保護並在派生類中聲明'using'指令'public'不起作用:'StaticBaseA :: announce()'在函數中不可訪問主要。據我所知,這種推廣是不可能的。 –