2012-02-29 99 views
3

我有這樣的設置:如何專門化這個模板成員函數?

class DontUse; 

template<class T,class U = DontUse, class V = SomeStandardType> 
class Foo 
{ 
    public: 
    void bar(U &uh); 
}; 

當U設置爲DontUse,我想欄是空的功能。在所有其他情況下,我希望酒吧有一些實施。我試着這樣做使用專業化,但是這個代碼(這是我知道的是莫名其妙不正確的)不會編譯:

template<class T,class V> void Foo<T,DontUse,V>::bar(DontUse &none){} 
template<class T,class U,class V> void Foo<T,U,V>::bar(U &uh) 
{ 
    //do something here 
} 

錯誤信息是這樣的(MSVC10):

1>path_to_project: error C2244: 'Foo<T,U,V>::bar' : unable to match function definition to an existing declaration 

並將其指向第一個模板專業化的行。

如何正確執行此操作?

下面是實際的代碼,雖然它降低到極簡一部分是相關的:

struct DontUse; 

    template<typename Derived, typename Renderer = DontUse, typename TimeType = long> 
    class Gamestate 
    { 
    public: 

     void Render(Renderer &r); 

    }; 

    template<typename Derived, typename TimeType> void Gamestate<Derived, DontUse,TimeType>::Render(DontUse){} 
    template<typename Derived, typename Renderer, typename TimeType> void Gamestate<Derived,Renderer,TimeType>::Render(Renderer &r) 
    { 
     static_cast<Derived*>(this)->Render(r); 
    } 
+0

你可以發佈你的專業類的定義嗎? – Nate 2012-02-29 15:52:46

+0

@Nate:是的,我把它放在問題中。 – TravisG 2012-02-29 16:17:16

回答

3

不能專注模板的個人會員。你有專攻類本身:

class DontUse; 

template<class T, class V> 
class Foo<T, DontUse, V> 
{ 
   public: 
     void bar(DontUse) 
    { } 
}; 
3

我建議只使用此:

#include <type_traits> 

template <class A, class B, class C> 
struct S 
{ 
    void foo(B& b) 
    { 
     static_assert(!std::is_same<U, DontUse>::value, "Bad Boy!"); 
    } 
}; 

或者,如果你真的想要一個空的功能,只是如果使用。

#include <type_traits> 

template <class A, class B, class C> 
struct S 
{ 
    void foo(B& b) 
    { 
     if(!std::is_same<U, DontUse>::value) 
     { 
       //all code goes here 
     } 
    } 
}; 
+0

謝謝,但這樣做是不夠的。重點是讓用戶可以實例化派生的,它實際上並不進行任何渲染(例如用於服務器端編程)。我可以讓用戶離開那個功能但是空的,但我認爲這樣做會更舒適一些。順便說一句,我會接受Bo Persson的答案,因爲從技術上講,他更精確地回答了我的問題(如何專門化這個東西)並給出了代碼。 – TravisG 2012-02-29 16:14:57

+0

@heishe有了is_same,你就可以做任何你想做的事情。拋出異常,調用另一個函數等等。我沒有看到你在這裏遇到問題。 – cooky451 2012-02-29 16:30:02

+0

是的,我明白你的意思了。只要做無效渲染(渲染器&r){如果(is_same <...> ::值){什麼都不做}其他{做默認的東西}}。不過,我在這裏問了一個關於這個問題的後續問題,它詢問在編譯時這是否是可能的:http://stackoverflow.com/questions/9503042/how-do-i-select-an-alternative -member-function-implementation-depends-on-a-te#comment12033196_9503042 – TravisG 2012-02-29 16:45:39

1

它不這樣工作。類模板的成員函數本身不是一個單獨的模板,不能獨立於類模板而專門化(部分或全部)。

您需要定義類模板Foo的部分特化,給它一個bar成員函數,然後定義它。