Как мне специализировать эту функцию-член шаблона? - PullRequest
3 голосов
/ 29 февраля 2012

У меня есть эта настройка:

class DontUse;

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

Когда U установлен на DontUse, я хочу, чтобы bar была пустой функцией.Во всех остальных случаях я хочу, чтобы у бара была некоторая реализация.Я пытался сделать это, используя специализацию, но этот код (который я понимаю, что-то неверно) не компилируется:

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);
    }

Ответы [ 3 ]

3 голосов
/ 29 февраля 2012

Я рекомендую просто использовать это:

#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!");
    }
};

Или, если вы действительно хотите пустую функцию, просто используйте if.

#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
         }
    }
};
3 голосов
/ 29 февраля 2012

Вы не можете специализировать отдельных членов шаблона.Вы должны специализировать сам класс:

class DontUse;

template<class T, class V>
class Foo<T, DontUse, V>
{
   public:
     void bar(DontUse)
     { }
};
1 голос
/ 29 февраля 2012

Так не работает. Функция-член шаблона класса сама по себе не является отдельным шаблоном и не может быть специализированной (частично или полностью) независимо от шаблона класса.

Вам необходимо определить частичную специализацию шаблона класса Foo, присвоить ему bar функцию-член и определить ее.

...