У меня есть эта настройка:
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);
}