I am trying to code a simple program using std, but, whenever I do visual studio gives an error based in the Xutility file.
the file is basic but, I wanted to test out some functions this is the code:
#include <iostream>
std::string text = "racecar", temp, revText;
bool yes;
void init(){
//std::cin >> text ;
reverseFunction(text);}
void reverseFunction(std::string userWord){
std::reverse(userWord, revText);}
int main(int argc, char *argv[]){
init();}
I am using VS 2015 but I installed 2017 on a new laptop and both have the same problem… these are the errors that I am given
C2794 ‘iterator_category’: is not a member of any direct or indirect base class of ‘std::iterator_traits<_InIt>’ Project1 c:\program files (x86)\microsoft visual studio 14.0\vc\include\xutility 967
Error
C2938 ‘_Iter_cat_t’ : Failed to specialize alias template Project1 c:\program files (x86)\microsoft visual studio 14.0\vc\include\xutility 967
Error
C2062 type ‘unknown-type’ unexpected Project1 c:\program files (x86)\microsoft visual studio 14.0\vc\include\xutility 967
Error
C2675 unary ‘—‘: ‘std::string’ does not define this operator or a conversion to a type acceptable to the predefined operator Project1 c:\program files (x86)\microsoft visual studio 14.0\vc\include\xutility 3547
Error
C2675 unary ‘++’: ‘std::string’ does not define this operator or a conversion to a type acceptable to the predefined operator Project1 c:\program files (x86)\microsoft visual studio 14.0\vc\include\xutility 3547
is there any fix for this as I have two machines, running different versions and both have the same problem and I can’t compile with the errors
asked Apr 11, 2017 at 8:34
Does this version of the code fixes it ?
#include <iostream>
#include <string>
#include <algorithm>
std::string text = "racecar", temp, revText;
bool yes;
void reverseFunction(std::string userWord)
{
revText = userWord;
std::reverse(revText.begin(), revText.end());
}
void init()
{
//std::cin >> text ;
reverseFunction(text);
}
int main(int argc, char *argv[])
{
init();
}
There were some errors:
string
andalgorithm
includes were missingreverseFunction()
was defined afterinit()
, hence the compiler could not find it-
According to the docs,
std::reverse
takes thebegin
andend
iterators as parameters, and not the string you want to reverse and where you want to store it. There are to reasons for this:1- The data transformation is done in-place,
2- The STL algorithms are meant to be generic and container agnostic: they should work on any collection that is somehow iterable. To convince yourself you can try this piece of code out:
#include <algorithm> #include <iostream> int main() { int t[] = { 0, 1, 2, 3, 4, 5 }; int len = sizeof t / sizeof(int); std::cout << "Before: "; for (int i = 0; i < len; ++i) std::cout << t[i] << " "; std::cout << std::endl; std::reverse(t, t + len); std::cout << "After: "; for (int i = 0; i < len; ++i) std::cout << t[i] << " "; std::cout << std::endl; return 0; }
This should give you the following output:
Before: 0 1 2 3 4 5
After: 5 4 3 2 1 0
As you can see, the algorithm still works, even if we are not using STL containers, we just provided iterator-like inputs.
answered Apr 12, 2017 at 8:04
cmourgliacmourglia
2,4331 gold badge17 silver badges33 bronze badges
1
- Remove From My Forums
-
Question
-
I have a code as below:
Code Block
class CSIStructure {…}
struct SIPidTables {
SIPidTables(long p, TableColl *t) : m_Pid(p), m_Tables(t) {}
long m_Pid;
TableColl *m_Tables;
};inline bool operator<(const SIPidTables &l, const SIPidTables &r) // The error marker shows on this line
{
return l.m_Pid < r.m_Pid;
}I am getting compilation error as below: (I have included the entire compilation log)
f:\program files\microsoft visual studio 8\vc\include\xutility(267) : error C2678: binary ‘<‘ : no operator found which takes a left-hand operand of type ‘const CSIStructure:ITableType’ (or there is no acceptable conversion)
z:\india-mpeg-internal\codebases\multiplexer\src\ei243 (muxnavigator)\sitreeitems.h(145): could be ‘bool operator <(const SIPidTables &,const SIPidTables &)’ [found using argument-dependent lookup]
1> z:\india-mpeg-internal\codebases\multiplexer\src\ei243 (muxnavigator)\sitreeitems.h(122): or ‘bool CSIStructure:ITableType:perator <(const CSIStructure:ITableType &)’
1> while trying to match the argument list ‘(const CSIStructure:ITableType, CSIStructure:ITableType)’
1> f:\program files\microsoft visual studio 8\vc\include\algorithm(1992) : see reference to function template instantiation ‘bool std::_Debug_lt(_Ty1 &,const _Ty2 &,const wchar_t *,unsigned int)’ being compiled
1> with
1> [
1> _Ty=CSIStructure:ITableType,
1> _Ty1=CSIStructure:ITableType,
1> _Ty2=CSIStructure:ITableType
1> ]
1> f:\program files\microsoft visual studio 8\vc\include\algorithm(2004) : see reference to function template instantiation ‘_FwdIt std::_Lower_bound<std::_Vector_iterator,_Ty,__w64 int>(_FwdIt,_FwdIt,const _Ty &,_Diff *)’ being compiled
1> with
1> [
1> _FwdIt=std::_Vector_iterator<CSIStructure::SITableType,std::allocator>,
1> _Ty=CSIStructure:ITableType,
1> _Alloc=std::allocator,
1> _Diff=__w64 int
1> ]
1> z:\india-mpeg-internal\codebases\multiplexer\src\ei243 (muxnavigator)\sitreeitems.cpp(69) : see reference to function template instantiation ‘_FwdIt std::lower_bound<std::_Vector_iterator,CSIStructure:ITableType>(_FwdIt,_FwdIt,const _Ty &)’ being compiled
1> with
1> [
1> _FwdIt=std::_Vector_iterator<CSIStructure::SITableType,std::allocator>,
1> _Ty=CSIStructure:ITableType,
1> _Alloc=std::allocator
1> ]
The code around xutility(267)Code Block
template inline
bool __CLRCALL_OR_CDECL _Debug_lt(_Ty1& _Left, const _Ty2& _Right,
const wchar_t *_Where, unsigned int _Line)
{ // test if _Left < _Right and operator< is strict weak ordering
if (!(_Left < _Right))
return (false);
else if (_Right < _Left) // The error marker shows on this line
_DEBUG_ERROR2(«invalid operator<«, _Where, _Line);
return (true);
}(I have no idea how to stop those smileys from appearing)
</CSIStructure::SITableType,std::allocator</std::_Vector_iterator</CSIStructure::SITableType,std::allocator</std::_Vector_iterator
Answers
-
According to error messages, maybe you should use the predicate version of lower_bound function at line 126 of sitreeitems.cpp file?
Matubo 0 / 0 / 0 Регистрация: 12.01.2014 Сообщений: 10 |
||||||||||||
1 |
||||||||||||
26.05.2014, 12:04. Показов 3407. Ответов 4 Метки нет (Все метки)
Не могу разобраться с ошибкой :error C2064: результатом вычисления фрагмента не является функция, принимающая 2 аргументов.
Не могу понять как с ней разобраться, буду рад любой помощи.
сруктура.h
0 |
4773 / 3267 / 497 Регистрация: 19.02.2013 Сообщений: 9,046 |
|
26.05.2014, 14:04 |
2 |
что за тип str (строка 29)?
0 |
0 / 0 / 0 Регистрация: 12.01.2014 Сообщений: 10 |
|
27.05.2014, 12:27 [ТС] |
3 |
что за тип str (строка 29)? Объявление структуры str именем m
0 |
Tulosba
4773 / 3267 / 497 Регистрация: 19.02.2013 Сообщений: 9,046 |
||||
27.05.2014, 14:34 |
4 |
|||
Сообщение было отмечено Matubo как решение РешениеMatubo, чтобы собиралось, исправьте начало файла:
Корректность алгоритма не проверял.
0 |
0 / 0 / 0 Регистрация: 12.01.2014 Сообщений: 10 |
|
29.05.2014, 22:07 [ТС] |
5 |
чтобы собиралось, исправьте начало файла: Спасибо большое, все собирается)
0 |
I wrote a program in C# for my discrete mathematics class and it worked absolutely fine. My teacher asked me to submit the code in c++ so she can run it on her mac and so I created a new project and typed the code in. After changing everything required (basic syntax editing and changing Lists to vectors) I tried compiling my program and got these errors. I am using visual studio 2010.
Error 6 error C4430: missing type specifier — int assumed. Note: C++ does not support default-int c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility 373 1 hw9_2_cpp
Error 8 error C2868: ‘std::iterator_traits<_Iter>::iterator_category’ : illegal syntax for using-declaration; expected qualified-name c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility 373 1 hw9_2_cpp
Error 7 error C2602: ‘std::iterator_traits<_Iter>::iterator_category’ is not a member of a base class of ‘std::iterator_traits<_Iter>’ c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility 373 1 hw9_2_cpp
Error 5 error C2146: syntax error : missing ‘;’ before identifier ‘iterator_category’ c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility 373 1 hw9_2_cpp
Error 4 error C2039: ‘iterator_category’ : is not a member of ‘std::vector<_Ty,_Ax>’ c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility 373 1 hw9_2_cpp
I haven’t posted the source code yet, because my program compiles successfully using g++ on a linux machine. I get no warnings and errors using that and the execution of program is fine too.
I have no idea why I am getting this error. Could it possible be that I messed up that xutility file?
Do you suggest replacing that file (I really don’t want to get into a version mismatch and get screwed up!) ?
Any help/suggestions are highly appreciated.
Thank you,
-T2
P.S.: I came back here after an year and now it reads «Contribute New Article» instead of posting a question or something. I couldn’t find anything like that and I think it’s just that way. I was just wondering as it’s not really an article but a question.
Я пытаюсь написать простую программу с использованием std, но всякий раз, когда я делаю это, Visual Studio выдает ошибку, основанную на файле Xutility.
файл является основным, но я хотел проверить некоторые функции, это код:
#include <iostream>
std::string text = "racecar", temp, revText;
bool yes;
void init(){
//std::cin >> text ;
reverseFunction(text);}
void reverseFunction(std::string userWord){
std::reverse(userWord, revText);}
int main(int argc, char *argv[]){
init();}
Я использую VS 2015, но я установил 2017 на новом ноутбуке, и у обоих та же проблема … это ошибки, которые мне дают
C2794 ‘iterator_category’: не является членом какого-либо прямого или косвенного базового класса ‘std :: iterator_traits<_InIt> ‘Project1 c: \ program files (x86) \ Microsoft Visual Studio 14.0 \ vc \ include \ xutility 967
ошибка
C2938 ‘_Iter_cat_t’: не удалось специализировать шаблон псевдонима Project1 c: \ program files (x86) \ microsoft visual studio 14.0 \ vc \ include \ xutility 967
ошибка
C2062 тип «неизвестного типа» неожиданный Project1 c: \ program files (x86) \ microsoft visual studio 14.0 \ vc \ include \ xutility 967
ошибка
C2675 унарный ‘-‘: ‘std :: string’ не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора Project1 c: \ program files (x86) \ microsoft visual studio 14.0 \ vc \ include \ xutility 3547
ошибка
C2675 унарный ‘++’: ‘std :: string’ не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора Project1 c: \ program files (x86) \ microsoft visual studio 14.0 \ vc \ include \ xutility 3547
Есть ли какое-то решение для этого, так как у меня есть две машины, работающие в разных версиях, и обе имеют одну и ту же проблему, и я не могу скомпилировать с ошибками
0
Решение
Эта версия кода исправляет это?
#include <iostream>
#include <string>
#include <algorithm>
std::string text = "racecar", temp, revText;
bool yes;
void reverseFunction(std::string userWord)
{
revText = userWord;
std::reverse(revText.begin(), revText.end());
}
void init()
{
//std::cin >> text ;
reverseFunction(text);
}
int main(int argc, char *argv[])
{
init();
}
Были некоторые ошибки:
string
а такжеalgorithm
в том числе отсутствовалиreverseFunction()
был определен послеinit()
следовательно, компилятор не может его найти-
В соответствии с документы,
std::reverse
принимаетbegin
а такжеend
итераторы как параметры, а не строка, которую вы хотите изменить, и где вы хотите ее сохранить. Есть причины для этого:1- Преобразование данных выполняется на месте,
2. Алгоритмы STL должны быть универсальными и не зависящими от контейнера: они должны работать с любой коллекцией, которая каким-то образом повторяется. Чтобы убедить себя, вы можете попробовать этот кусок кода:
#include <algorithm> #include <iostream> int main() { int t[] = { 0, 1, 2, 3, 4, 5 }; int len = sizeof t / sizeof(int); std::cout << "Before: "; for (int i = 0; i < len; ++i) std::cout << t[i] << " "; std::cout << std::endl; std::reverse(t, t + len); std::cout << "After: "; for (int i = 0; i < len; ++i) std::cout << t[i] << " "; std::cout << std::endl; return 0; }
Это должно дать вам следующий вывод:
Before: 0 1 2 3 4 5
After: 5 4 3 2 1 0
Как видите, алгоритм все еще работает, даже если мы не используем контейнеры STL, мы просто предоставили итератор типа входы.
0
Другие решения
Других решений пока нет …