Явная специализация в области действия, не связанной с пространством имен ... Очень нужна помощь - PullRequest
1 голос
/ 19 апреля 2011

Может кто-нибудь помочь мне перенести следующий код на GCC ?Я нашел много или связанных вопросов на этом сайте, но я просто не могу применить предложенные обходные пути в моем случае ...

typedef float MyData __attribute__ ((__vector_size__ (16)));

template <typename T> class Data_T
{
    public:
    template < typename U > static bool IsEqual (const T & a, const T & b)
    {
        return a == b;
    }

    //Fixed: template <> static bool IsEqual < MyData > ( const MyData & a, const MyData & b)
    static bool IsEqual ( const MyData & a, const MyData & b)
    {
        return true;
    }

    void TriggerProblem(const T & val)
    {
        if (!IsEqual(1.0f, val)) // Error: no matching function for call to 'Data_T<float>::IsEqual(float, const float&)'
        {

        }
    }
};

Код, вызывающий проблему:

Data_T<MyData> inst;
inst.TriggerProblem(1.0f);

Я получил сообщение об ошибке ошибка: явная специализация в области отсутствия пространства имен 'class Data_T' , которая была вызвана функцией специализации IsEqual () , но теперь обнаружил другой типошибки ( нет соответствующей функции для вызова 'Data_T :: IsEqual (float, const float &)' ), что, вероятно, вызвано атрибутом __ vector_size __ , который я не могуУдалить.Пожалуйста, помогите ...

1 Ответ

2 голосов
/ 20 апреля 2011

В этом случае вместо специализации достаточно перегрузки:

template <typename T> class Data_T
{
public:
    template<typename U> static bool IsEqual(const U& a, const U& b)
    {
        return a == b;
    }

    static bool IsEqual(const MyData& a, const MyData& b)
    {
        return MyDataTypeIsEqual (a, b);
    }

    template<typename U> bool IsRangeEqual(const U& a, const U& b, const U& delta)
    {
        return  (a >= b) ? (a - b <= delta) : (b - a <= delta);
    }

    bool IsRangeEqual(const MyData & a, const MyData & b, const MyData & accuracy)
    {
        return MyDataTypeIsRangeEqual (a, b, accuracy);
    }
};

Изменить относительно обновления :
В то время как для меня преобразование из float в float __vector__ уже не удается, у вас, похоже, опечатка:

template<typename U> static bool IsEqual(const T& a, const T& b)

против .:

template<typename U> static bool IsEqual(const U& a, const U& b)

Я исправил вышеуказанный код соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...