Имам тази настройка:
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);
}