2011-04-19 57 views
1

有人可以帮我把以下代码移植到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); 

我得到一个错误错误:在非名称空间范围'类Data_T'中显式专门化,这是由专业化函数IsEqual()引起的,但现在遇到另一种类型的错误(没有用于调用'Data_T :: IsEqual(float,const float &)'),这似乎是由我无法删除的__vector_size__属性造成的。请帮助...

+0

C99与它有什么关系,这是C++代码? – jonsca 2011-04-19 10:04:37

+0

对不起,我的意思是ISO/IEC 14882:2003标准 – Ryan 2011-04-19 10:19:48

回答

2

在这种情况下,超载应该足够了,而不是专业:

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); 
    } 
}; 

关于编辑更新
虽然我从floatfloat __vector__转换已经失败,你似乎有一个错字:

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

VS:

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

我相应地修正了上面的代码。

+0

Man ...你是个天才! – Ryan 2011-04-20 06:43:12

+0

@Ryan:不是真的,只是我的公平份额已经:) – 2011-04-20 07:35:34

+0

:)其实,我很抱歉地说,但是这个解决方案并不适合我... IsEqual()函数调用给我一个错误“没有匹配函数调用...”如果我传递MyData参数,它实际上是基于浮点类型...回到方块1 :( – Ryan 2011-04-20 08:14:22