class C
{
public:
template <typename T>
C(int (T::*func)(char const*, const int));
C(int (*func)(char const*, const int));
};
struct Test
{
int foo(char const*, const int);
};
int foo(char const*, const int);
int main(int argc, char * argv[])
{
C c(&Test::foo);
return 0;
}
Из-за выделенного в коде не компилируется с ошибкой:
error C2664: 'C::C(int (__cdecl *)(const char *,const int))' : cannot convert parameter 1 from 'int (__thiscall Test::* )(const char *,const int)' to 'int (__cdecl *)(const char *,const int)'
Не могу понять как это влияет на невозможность выбора нужного конструктора. Баг?
В VС2008 все нормально.
А в VC2005 не то чтобы невозможность выбора, она просто не видит этого конструктора: если удалить второй (нешаблонный) конструктор, то будет ругаться, что не может использовать дефолтовый конструктор; если удалить шаблонный конструктор, сообщение об ошибке даже не поменяется.
// ...
подпись