Re: template class specialization trouble
On Apr 7, 9:13 am, Road Dog <no...@nowhere.com> wrote:
template <typename A, typename B, void (A::*MF)(B)>
class D
{
};
template <typename A, void (A::*MF)()>
class D<A, void, MF>
class D
{
};
produces:
test4.cc:17: error: invalid parameter type 'void'
test4.cc:12: error: in declaration 'template<class T, class W, void
Is there some way to specialize on 'void' here ?
Yes - use a "helper" class template. For example:
// General helper class template
template <class T, class P>
struct MemberPointerHelper
{
typedef void (T::*type)(P);
};
// Partial specialization for "void" parameter
template <class T>
struct MemberPointerHelper<T, void>
{
typedef void (T::*type)();
};
// The "D" class template now uses MemberPointerHelper
// to specify the member function pointer type
// of its non-type, third template parameter
template <class A, class B,
typename MemberPointerHelper<A, B>::type MF>
class D
{
};
// Test class
struct S
{
void f1(int i){}
void f2(){}
};
int main()
{
D<S, int, &S::f1> d1; // OK
D<S, void, &S::f2> d2; // OK
}
Greg
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]