Обнаружьте, если класс имеет сбои перегруженной функции на компиляторе Comeau

Я пытаюсь использовать SFINAE, чтобы обнаружить, если класс имеет перегруженную функцию членства, которая берет определенный тип. Код, который я имею, кажется, работает правильно в Visual Studio и GCC, но не компилирует использование Comeau компилятор онлайн.

Вот код, который я использую:

#include <stdio.h>

//Comeau doesnt' have boost, so define our own enable_if_c
template<bool value> struct enable_if_c { typedef void type; };
template<> struct enable_if_c< false > {}; 


//Class that has the overloaded member function
class TestClass
{
public:
    void Func(float value) { printf( "%f\n", value ); }
    void Func(int value) { printf( "%i\n", value ); }
};


//Struct to detect if TestClass has an overloaded member function for type T
template<typename T>
struct HasFunc
{
    template<typename U, void (TestClass::*)( U )> struct SFINAE {};
    template<typename U> static char Test(SFINAE<U, &TestClass::Func>*);
    template<typename U> static int Test(...);
    static const bool Has = sizeof(Test<T>(0)) == sizeof(char);
};


//Use enable_if_c to only allow the function call if TestClass has a valid overload for T
template<typename T> typename enable_if_c<HasFunc<T>::Has>::type CallFunc(TestClass &test, T value) { test.Func( value ); } 

int main()
{
    float value1 = 0.0f;
    int value2 = 0;
    TestClass testClass;
    CallFunc( testClass, value1 );  //Should call TestClass::Func( float )
    CallFunc( testClass, value2 );  //Should call TestClass::Func( int )
}

Сообщение об ошибке: никакой экземпляр шаблона функции "CallFunc" не соответствует списку аргументов. Кажется что HasFunc:: Имеет ложь для интервала и плавания, когда это должно быть верно.

Действительно ли это - ошибка в компиляторе Comeau? Я делаю что-то, что это не стандартно? И если так, что я должен сделать для фиксации его?

Обновление

Я предполагаю, что вопрос теперь становится, если это - ошибка, есть ли что-нибудь, что я могу сделать для работы вокруг этого? Я пытался использовать static_cast на &TestClass:: Func, но или это не возможно, или я не разобрался в синтаксисе, потому что я не мог заставить его компилировать.

Если это не решение, есть ли какие-либо модификации, которые я могу сделать или к TestClass или к HasFunc для работы вокруг проблемы?

6
задан Fred Nurk 6 May 2011 в 03:13
поделиться

1 ответ

Я подозреваю, что проблема в том, что, поскольку TestClass перегружает Func, и компилятор Comeau не может устранить неоднозначность & TestClass :: Func, даже если он должен.

0
ответ дан 18 December 2019 в 04:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: