2014-12-07 69 views
0

例如,我有一個類A和一個靜態方法foo的類。我有一個命名空間nm,並且想要將A :: foo引入到命名空間中。我試試以下如何將類的靜態方法引入到名稱空間?

namespace nm { 
    using A::foo; 

    void f() 
    { 
     foo(...); // use A::foo 
    } 
} 

但不能編譯,因爲A不是一個名稱空間,因此使用指令在這裏不起作用。任何方式來實現這個想法?我想在我的GUI項目中將它用於QObject :: tr和QObject :: connect以節省一些空間。

+0

如果我沒看錯的,靜態的方法是一個類方法,爲什麼它有可能使它成爲一個名稱空間函數?爲什麼不直接在你想要的任何東西中直接使用方法Class.method()? – nbro 2014-12-07 23:11:49

回答

3

不直接。 [namespace.udecl]/8:

一類構件using聲明應爲成員聲明。 [例:

struct X { 
    int i; 
    static int s; 
} 

void f() { 
    using X::i; // error: X::i is a class member 
       // and this is not a member declaration. 
    using X::s; // error: X::s is a class member 
       // and this is not a member declaration. 
} 

- 結束例如]

但是你可以使用SFINAE和完美轉發模擬foo

template <typename... Args> 
auto foo(Args&&... args) 
    -> decltype(A::foo(std::forward<Args>(args)...)) 
{ 
    return A::foo(std::forward<Args>(args)...); 
} 
+0

嗯。也許我們應該使用'static static'來爲類成員引入該名稱的所有'static'符號。 – Deduplicator 2014-12-07 23:30:18

+0

@Deduplicator這將永遠不會被委員會接受。 – Columbo 2014-12-07 23:31:42

相關問題