2012-01-20 68 views
0
template<typename T> T SmartIO::Peek() { 
    T temp; 
    T tempReturn; 

    while(true){ 
     temp = *(T*)&buffer[ptrSeek]; 

     if(temp !=0){ 
      ptrSeek++; 
      tempReturn += *(T*)&buffer[ptrSeek]; 
     } 
     else{ 
      break; 
     } 
    } 

    return tempReturn; 
} 

所以我想要做的是,从ptrSeek开始读取循环,将值添加到temp并检查temp的值!= 0将此值添加到tempReturn,一旦临时的值是0打破循环,并返回tempReturnbut,但它不断给我这个错误:错误C2678:二进制'!=':没有找到需要左手操作数的操作符

error C2678: binary '!=' : no operator found which takes a left-hand operand of type 'std::basic_string<_Elem,_Traits,_Ax>' (or there is no acceptable conversion) 

我怎么可以在这里解决这个问题呢?

回答

4

没有您的模板代码一个根本性的问题,如果你正试图比较任意类型T对数字常量0,你在这里做代码:

T temp; 

/* ... */ 

if(temp != 0){ 
    /* ... */ 
} 

这里的问题是, T是任意类型(在这种情况下,你似乎是用实例化的std::string模板),但你期待该类型可比较为0,这是完全正常的 - 它只是限制T是可以对被比较的类型0 - 但事实上,你报告这是一个错误,我不知道你是否知道这一点。

你的选择或者不是用std::string作为参数来实例化这个模板(它的写法,我不认为你应该能够做到这一点,因为它看起来像函数不断增加值某种类型的),或者调试模板并改变其行为。我不太清楚你想要代码做什么,所以在后一种情况下,我不知道我可以如何提供帮助。

希望能澄清一些事情!

+0

我所要做的就是检查temp是否有值或没有值,我会打断循环。 – Abanoub

+0

你是什么意思“有价值与否?”一切都有价值。你的意思是它是否有你关心的某个特定的价值? – templatetypedef

+0

好吧,我希望它返回下一个可用的字符,这是我的主要观点,然后我想把它作为模板,所以我可以返回下一个可用的类型,我把它传递给模板! – Abanoub

0

对于与0不能直接比较的类型,您可以将专用或过载比较部分(此处为!=)。只是一个例子,

template<typename T> 
bool NotEqualto0 (const T& obj) { return (obj != 0); } 

// overload for std::string  
bool NotEqualto0 (const std::string &s) { return (s.c_str() != 0); } 

... 
if(NotEqualto0(temp)) 
... 

[以上功能被硬连接至用于0;它可以根据需要进行推广。]

+0

这滞后于我的整个PC它使用我的整个内存和CPU迫使我重新启动PC! – Abanoub

+0

@MixedCoder,它不应该发生。我没有在代码中看到任何错误,我发布了。字符串形成是否不正确。 – iammilind

相关问题