Отсутствует аргумент шаблона для логического оператора? - PullRequest
0 голосов
/ 31 июля 2010

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

#include <iostream>
#include <vector>

int main( int argc, char** argv )
{
    using std::cout;
    using std::endl;
    using std::cin;
    using std::string;

    CDLinkedList<std::string> list;
    list.push_back("Hello");
    list.push_back(",");
    list.push_back("World.");
    cout << "Displaying normally..." << endl;
    list.display();
    cout << "Displaying backwards..." << endl;
    list.display(::Direction::Backward);

    cin.get();
    return 0;
}

Шаблоны работают с вводом int, а не со строкой, что я сейчас пытаюсь заставить работать.

Последняя функция Node *operator()(T data) - мой текущий проблемный потомок.Я получаю ошибку:

error C2784: 'bool std::operator !=(const std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)' : could not deduce template argument for 'const std::vector<_Ty,_Alloc> &' from 'std::string'

Что здесь не так?

Ответы [ 2 ]

4 голосов
/ 31 июля 2010

Вам не хватает операторов сравнения для std::string. Попробуйте добавить

#include <string>

в вашем исходном файле, который содержит main.

Включая <iostream>, вы получите предварительную декларацию std::string. Это потому, что <iostream> позволяет вам выполнять много строковых операций (например, он позволяет вам преобразовывать строку из / во что угодно, используя потоки строк) Однако это предварительное объявление не дает никаких операторов сравнения. Для этого вам нужно включить <string>.

Для чего бы это ни стоило, вы могли бы свернуть свой тестовый набор до

#include <iostream>

bool f() {
    std::string a, b;
    return a != b;
}

, чтобы продемонстрировать эту проблему. Этот тестовый пример не может быть скомпилирован по той же причине, и включение <string> заставляет его работать.

3 голосов
/ 31 июля 2010

Я собираюсь сделать дикий удар в темноте.

Я думаю, что вы должны #include <string>, а не <vector>. Вы можете иметь прямое объявление видимой строки, но без <string> Я не думаю, что у вас есть корректные перегрузки operator== и operator!=, видимые.

...