试图获取带有c++类的vector容器中元素的索引



我正在用SFML制作一个简单的TicTacToe游戏,但我遇到了一个奇怪的错误,当试图从矢量中获得元素的索引时,我不确定什么是错的或如何修复它,所以我构建了一个小的例子,运行相同的错误,希望有人能找到错误。

main.cpp:

#include "iostream"
#include "vector"
#include "algorithm"
using std::vector, std::find, std::distance, std::cout, std::endl;

class exampleClass {
public:
exampleClass() {}
virtual ~exampleClass() {}
};

int getIndex(vector<exampleClass>& vectorToIterate, exampleClass elementToFind) {
vector<exampleClass>::iterator itr = find(vectorToIterate.begin(), vectorToIterate.end(), elementToFind);
int index = distance(vectorToIterate.begin(), itr);
return index;
}

int main() {
vector<exampleClass> vectorToIterate;
exampleClass elementToFind;
for (int i = 0; i < 10; i++) {
if (i == 5) {
vectorToIterate.push_back(elementToFind);
continue;
}
exampleClass fillingElement;
vectorToIterate.push_back(fillingElement);
}
cout << getIndex(vectorToIterate, elementToFind) << endl;
return 0;
}

输出/错误:

In file included from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0bitsstl_algobase.h:71,
from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0bitschar_traits.h:39,
from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0ios:40,
from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0ostream:38,
from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0iostream:39,
from C:UsersMarselDesktoptictactoeerror.cpp:1:
c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0bitspredefined_ops.h: In instantiation of 'bool __gnu_cxx::__ops::_Iter_equals_val<_Value>::operator()(_Iterator) [with _Iterator = __gnu_cxx::__normal_iterator<exampleClass*, std::vector<exampleClass> >; _Value = const exampleClass]':
c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0bitsstl_algobase.h:2069:14:   required from '_RandomAccessIterator std::__find_if(_RandomAccessIterator, _RandomAccessIterator, _Predicate, std::random_access_iterator_tag) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<exampleClass*, std::vector<exampleClass> >; _Predicate = __gnu_cxx::__ops::_Iter_equals_val<const exampleClass>]'
c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0bitsstl_algobase.h:2114:23:   required from '_Iterator std::__find_if(_Iterator, _Iterator, _Predicate) [with _Iterator = __gnu_cxx::__normal_iterator<exampleClass*, std::vector<exampleClass> >; _Predicate = __gnu_cxx::__ops::_Iter_equals_val<const exampleClass>]'
c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0bitsstl_algo.h:3884:28:   required from '_IIter std::find(_IIter, _IIter, const _Tp&) [with _IIter = __gnu_cxx::__normal_iterator<exampleClass*, std::vector<exampleClass> >; _Tp = exampleClass]'
C:UsersMarselDesktoptictactoeerror.cpp:16:43:   required from here
c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0bitspredefined_ops.h:270:24: error: no match for 'operator==' (operand types are 'exampleClass' and 'const exampleClass')
270 |         { return *__it == _M_value; }
|                  ~~~~~~^~~~~~~~~~~
In file included from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0bitsstl_algobase.h:67,
from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0bitschar_traits.h:39,
from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0ios:40,
from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0ostream:38,
from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0iostream:39,
from C:UsersMarselDesktoptictactoeerror.cpp:1:
c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0bitsstl_iterator.h:1121:5: note: candidate: 'template<class _IteratorL, class _IteratorR, class _Container> bool __gnu_cxx::operator==(const __gnu_cxx::__normal_iterator<_IteratorL, _Container>&, const __gnu_cxx::__normal_iterator<_IteratorR, _Container>&)'
1121 |     operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
|     ^~~~~~~~
c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0bitsstl_iterator.h:1121:5: note:   template argument deduction/substitution failed:
In file included from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0bitsstl_algobase.h:71,
from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0bitschar_traits.h:39,
from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0ios:40,
from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0ostream:38,
from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0iostream:39,
from C:UsersMarselDesktoptictactoeerror.cpp:1:
c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0bitspredefined_ops.h:270:24: note:   'exampleClass' is not derived from 'const __gnu_cxx::__normal_iterator<_IteratorL, _Container>'
270 |         { return *__it == _M_value; }
|                  ~~~~~~^~~~~~~~~~~
In file included from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0bitsstl_algobase.h:67,
from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0bitschar_traits.h:39,
from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0ios:40,
from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0ostream:38,
from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0iostream:39,
from C:UsersMarselDesktoptictactoeerror.cpp:1:
c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0bitsstl_iterator.h:1129:5: note: candidate: 'template<class _Iterator, class _Container> bool __gnu_cxx::operator==(const __gnu_cxx::__normal_iterator<_Iterator, _Container>&, const __gnu_cxx::__normal_iterator<_Iterator, _Container>&)'
1129 |     operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
|     ^~~~~~~~
c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0bitsstl_iterator.h:1129:5: note:   template argument deduction/substitution failed:
In file included from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0bitsstl_algobase.h:71,
from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0bitschar_traits.h:39,
from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0ios:40,
from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0ostream:38,
from c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0iostream:39,
from C:UsersMarselDesktoptictactoeerror.cpp:1:
c:programdatachocolateylibmingwtoolsinstallmingw64includec++11.2.0bitspredefined_ops.h:270:24: note:   'exampleClass' is not derived from 'const __gnu_cxx::__normal_iterator<_Iterator, _Container>'
270 |         { return *__it == _M_value; }
|                  ~~~~~~^~~~~~~~~~~
[Finished in 3.4s]

显然,我所要做的就是向exampleClass添加一些东西,std::find可以用来区分其他exampleClass(s)。所以我这样做了,它似乎有效。

#include "iostream"
#include "vector"
#include "algorithm"
using std::vector, std::find, std::distance, std::cout, std::endl;

class exampleClass {
public:
int value;
exampleClass(int value) {
this->value = value;
}
virtual ~exampleClass() {}
};

constexpr bool operator==(const exampleClass& lhs, const exampleClass& rhs) {
return lhs.value == rhs.value;
}

int getIndex(vector<exampleClass>& vectorToIterate, exampleClass elementToFind) {
vector<exampleClass>::iterator itr = find(vectorToIterate.begin(), vectorToIterate.end(), elementToFind);
int index = distance(vectorToIterate.begin(), itr);
return index;
}

int main() {
vector<exampleClass> vectorToIterate;
exampleClass elementToFind(5);
for (int i = 0; i < 10; i++) {
if (i == 5) {
vectorToIterate.push_back(elementToFind);
continue;
}
exampleClass fillingElement(i);
vectorToIterate.push_back(fillingElement);
}
cout << getIndex(vectorToIterate, elementToFind) << endl;
return 0;
}

最新更新