ошибка C2678: двоичный файл '! =': не найден оператор, который принимает левый операнд - PullRequest
0 голосов
/ 20 января 2012
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, и как только значение temp равно 0, прервите цикл.и вернуть tempReturnbut, но он продолжает выдавать мне эту ошибку:

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)

как я могу решить эту проблему здесь?

Ответы [ 2 ]

4 голосов
/ 20 января 2012

Существует фундаментальная проблема с кодом шаблона, если вы пытаетесь сравнить произвольный тип T с числовой константой 0, что вы делаете в коде здесь:

T temp;

/* ... */

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

Проблемаздесь T - произвольный тип (в данном случае вы, кажется, создаете экземпляр шаблона с помощью std::string), но вы ожидаете, что этот тип будет сопоставим с 0. Это прекрасно - он просто ограничивает T быть типами, которые можно сравнить с 0 - но из-за того, что вы сообщаете об этом как об ошибке, я не уверен, что вы знаете об этом.

Вы можете либо не создавать экземплярыэтот шаблон с std::string в качестве аргумента (как он написан, я не думаю, что вы должны это делать, так как похоже, что функция продолжает добавлять значения вместе какого-то типа), или для отладкишаблон и изменить его поведение.Я не совсем уверен, что вы хотите, чтобы код делал, поэтому в последнем случае я не уверен, как я могу помочь.

Надеюсь, это прояснит ситуацию!

0 голосов
/ 20 января 2012

Вы можете специализировать или перегрузить часть сравнения (здесь !=) для типов, которые прямо не сопоставимы с 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;это может быть обобщено согласно потребности.]

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