为什么当我定义它时我的变量不是常量?

lla*_*136 0 c++ vector

目前,我在尝试在vector. 我定义了一个vector, tests, 集来包含我自己的结构Test。它包含两个变量,onetwo。两者都是 的实例Test

Test不多,它只包含一个intchar

我定义了一个宏,用于查找对象的实例是否在给定中vector

当我尝试编译我的代码时,会导致此错误:

In file included from /usr/local/Cellar/gcc/10.2.0/include/c++/10.2.0/bits/stl_algobase.h:71,
                 from /usr/local/Cellar/gcc/10.2.0/include/c++/10.2.0/bits/char_traits.h:39,
                 from /usr/local/Cellar/gcc/10.2.0/include/c++/10.2.0/ios:40,
                 from /usr/local/Cellar/gcc/10.2.0/include/c++/10.2.0/ostream:38,
                 from /usr/local/Cellar/gcc/10.2.0/include/c++/10.2.0/iostream:39,
                 from test.cpp:1:
/usr/local/Cellar/gcc/10.2.0/include/c++/10.2.0/bits/predefined_ops.h: In instantiation of 'bool __gnu_cxx::__ops::_Iter_equals_val<_Value>::operator()(_Iterator) [with _Iterator = __gnu_cxx::__normal_iterator<Test*, std::vector<Test> >; _Value = const Test]':
/usr/local/Cellar/gcc/10.2.0/include/c++/10.2.0/bits/stl_algobase.h:1932:14:   required from '_RandomAccessIterator std::__find_if(_RandomAccessIterator, _RandomAccessIterator, _Predicate, std::random_access_iterator_tag) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Test*, std::vector<Test> >; _Predicate = __gnu_cxx::__ops::_Iter_equals_val<const Test>]'
/usr/local/Cellar/gcc/10.2.0/include/c++/10.2.0/bits/stl_algobase.h:1977:23:   required from '_Iterator std::__find_if(_Iterator, _Iterator, _Predicate) [with _Iterator = __gnu_cxx::__normal_iterator<Test*, std::vector<Test> >; _Predicate = __gnu_cxx::__ops::_Iter_equals_val<const Test>]'
/usr/local/Cellar/gcc/10.2.0/include/c++/10.2.0/bits/stl_algo.h:3902:28:   required from '_IIter std::find(_IIter, _IIter, const _Tp&) [with _IIter = __gnu_cxx::__normal_iterator<Test*, std::vector<Test> >; _Tp = Test]'
test.cpp:19:6:   required from here
/usr/local/Cellar/gcc/10.2.0/include/c++/10.2.0/bits/predefined_ops.h:268:17: error: no match for 'operator==' (operand types are 'Test' and 'const Test')
  268 |  { return *__it == _M_value; }
      |
Run Code Online (Sandbox Code Playgroud)

我发现有趣的是,我正在检查的变量被认为是常量,即使在我定义它时,它也不是。

源代码:

#include <iostream>
#include <vector>
#include <algorithm>

#define isin(one, two) (std::find(one.begin(), one.end(), two) != one.end())

struct Test {
    int one;
    char two;
};

int main() {
    Test one = { 6, 'n' };
    Test two = { 9, 'r' };

    std::vector<Test> tests = { one, two };

    if (isin(tests, one)) {
        std::cout << "one is in tests\n";
    } else {
        std::cout << "one is not in tests\n";
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么被one认为是常数?我是不是不小心做错了什么?

Joh*_*ica 5

error: no match for 'operator==' (operand types are 'Test' and 'const Test')
Run Code Online (Sandbox Code Playgroud)

您没有为 定义相等运算符Test。您需要定义operator==以便它知道如何检查两个实例是否相等。