I'm trying to compile a Visual C++ 2013 project but the compiler is throwing this mysterious error:
Error 1 error C2338: The C++ Standard doesn't provide a hash for this type.
It does not tell me which class that is missing a hash, nor does it tell me in which file the error occurs. Rather, it links me to a line in the file xstdef which seem to be one of the compiler's libraries.
How can such critical information have been left out of the error message and how do I go about figuring out which class that is the perpetrator?
If you look at the Output tab, it will sometimes list more lines of code (e.g. template instance generated from file/line.) This can help you find the real problem - it will usually be from somewhere trying to USE the class, and not point directly to the class definition.
If you've made recent changes, you can try bisecting or stashing to find the change that introduced the error.
Related
I am looking for a way to allow a language developed using ANTLR4 to support the concept of an include file. I need it to work with the C++ runtime version of ANTLR4.
I tried using code I found from ANTLR3 but got errors due to changes between ANTRL3 and ANTRL4. That example was corrected by Mike Lischke (see https://stackoverflow.com/a/59101124/57246) which the parser generator could handle but the generated C++ code does not compile. I get the following kinds of errors:
1) The statement CommonTree* includetree = nullptr; and gramLexer* innerlexer = new gramLexer(inputstream); produce errors
Unknown type name 'CommonTree'
Unknown type name 'gramLexer
2) The catch (Exception fnf) clause results in
Unknown type name 'Exception'
I don't know if there's a fundamental issue here or whether some extra C++ header files are required but I'm stuck and would really appreciate some help.
Thanks
I am trying to compile and link a Fortran project that includes code written by me as well as code written by some other team. The main program includes a lot of header files where for example common blocks are set up. While compiling the file with the main program, I got plenty of error messages by gfortran stating that The equivalence set for ‘%VARIABLENAME’ cause an invalid extension to COMMON '%BLOCKNAME'
The same main program and header files already worked in other programs. I have never seen this message before and could not find any description of what it means. Can anyone tell me more about it?
I found it out on my own and it was very simple: %VARIABLENAME in the above error message was in fact an array and had a size that was obviously too large (in the order of some millions) for a common block. This was due to the fact that the array dimensionality was set by a parameter in the code I got from another team where they set it to an arbitrary value. Reducing the array size to a value that actually made sense helped immediately.
Take home messages: avoid common blocks, always cross-check the code others give you.
I'm trying to work with a 3rd party C++ source code (TORO framework for robotic SLAM, you may get it via svn with: svn co https://www.openslam.org/data/svn/toro), by trying to encapsulate it in a DLL to be used in my C# code later.
However I get a variety of errors just by including the source files into my project.
For example for the following code
void TreePoseGraph<Ops>::revertEdge(TreePoseGraph<Ops>::Edge * e){
revertEdgeInfo(e);
Vertex* ap=e->v2;
e->v2=e->v1;
e->v1=ap;
}
I get the following errors:
error C2182: 'revertEdge' : illegal use of type 'void'
error C2470: 'AISNavigation::TreePoseGraph::revertEdge' : looks like a function d
definition, but there is no parameter list; skipping apparent body
error C2072: 'AISNavigation::TreePoseGraph::revertEdge' : initialization of a function
Of course the first thing I did was checking if it is included (revertEdge) in the right headers, and in the stdAfx.h and of course it was present everywhere.
Moreover, IntelliSense recognizes everything, can point me to the source of everything, so it seems that nothing is missing from the project. Yet, I get a huge amount of errors of the similar kind.
I'm sure I'm doing something very wrong here right at the beginning, which causes all this dump of nonsense error messages (well there may be 1-2 reasonable, but the rest is just the result of the avalance). Could you give any suggestion what could result in getting such a huge set of error messages?
Just a guess, but you might need a typename before the TreePoseGraph<Ops>::Edge in order to tell the compiler that Edge is actually a type, i.e.,
void TreePoseGraph<Ops>::revertEdge(typename TreePoseGraph<Ops>::Edge * e)
{
// ...
}
I think that this is how it should look:
template<class Ops> void TreePoseGraph<Ops>::revertEdge(TreePoseGraph<Ops>::Edge * e) {
// ...
}
I feel so dumb right now:
moveSequence look(COORD xyBeatle, fieldd &field);
what could be so wrong about that, to give a syntax error?
error C2061: syntax error : identifier 'fieldd'
What I am trying to do is pass an a reference of a class fieldd to look() via:
moveSequence sequence = look(xy, m_field);
It doesn't seem to recognize the type field
Actually I am being littered with errors all about things that should be type field are having type int assumed ect..
This is after a long week of refactoring and not even getting back to the point of compiling so I cannot tell what change immediately caused this.
edit: now I am noticing that intellisense is underlining, for only a moment, intermittently the places where the compiler is throwing real errors..... I disabled PCH and rebuilt but this didn't work.
edit2:
The variable name was NOT the problem, that was one of the first things I Tried.
edit3:
I was finally able to catch one of the intellisense errors and it read "identifier "fieldd" is undefined" before shortly changing to "class fieldd" I think this might be a problem with the headers. this guys problem was headers: http://www.gamedev.net/topic/555445-solvederror-c2061-syntax-error--identifier-t3dobject/
field appears to be a type name. Use a different variable name.
We really need more code to identify your problem but I wonder if you need to forward declare fieldd since you have refactored the code into different files, perhaps the headers are not included correctly or the dependencies no longer make sense?
changing your declaration to: moveSequence look(COORD xyBeatle, class fieldd &field)
might give you more information.
fieldd is not recognized as a type if I understand well.
Does fieldd foobar works over the line triggering the error? If not it's likely that you're missing the include declaring fieldd.
I'm consistently running into an internal compiler error while attempting to switch from MSVC6 to MSVC 2008. After much work commenting out different parts of the program, I've traced the error to two lines of code in two different CPP files. Both of these CPP files compile successfully, yet somehow have an effect on whether or not the error manifests in other files.
Both of those lines involve instantianting several complex, nested templates. They also appear to be the only places in the app that use an abstract class as one of the template parameters. That said, I'm far from certain that the issue involves either abstract classes or templates, it's just the most obvious thing I've noticed. I can't even be sure that these lines are significant at all. Here's what they look like, though:
m_phDSAttributes = new SObjDict<RWCString, SIDataSource>(&RWCString::hash);
So we've got SObjDict, a templatized dictionary class, SIDataSource, an abstract interface, and the parameter is a pointer to a static member function of RWCString.
I've been playing around with the code some, and I can occasionally get the error to move from one CPP file to another (for instance, I changed a bunch of template declarations from using class to typename), but I can't find any rhyme or reason to it.
I'm at a loss as to how to debug this issue further. The exact error output by the compiler (with the name of my source file changed) is below. There is no mention of it anywhere on the internet. I'm pretty desperate for any advice on how to proceed. I don't expect someone to say "oh, you just need to do XYZ", but a pointer on how to debug this sort of issue would be greatly appreciated.
1>d:\Dev\webapi.cpp : fatal error C1001: An internal error has occurred in the compiler.
1>(compiler file 'f:\dd\vctools\compiler\utc\src\p2\p2symtab.c', line 5905)
The trick seems to be disabling precompiled headers. I have no idea why that solves the problem, and it's very unfortunate since my build time for the affected project has gone from less than 30 secs to nearly 5 minutes, but at least I can progress forward.
It's a reasonable bet to assume that p2symtab.c is (part of) the symbol table code. This would immediately explain how the upgrade caused it; this code has been rewritten. (Remember the 255 character length warnings of VC6?)
In this case, there is no new entry in the symbol table, so it's likely a lookup in the symbol table failing spectactularly. It would be interesting to see if the context in which th name lookup happens affects the result. For instance, what happens if you change the code to
typedef SObjDict<RWCString, SIDataSource> SObjDict_RWCString_SIDataSource;
m_phDSAttributes = new SObjDict_RWCString_SIDataSource(&RWCString::hash);
This will force another symbol table entry to be created, for SObjDict_RWCString_SIDataSource. This entry is sort of a symbolic link to the template instantiation. The new name can (and must) be looked up on its own.
Start breaking it down into smaller parts. My first guess is the pointer to the static function is going to be the problem. Can you make a dummy non-template class with the same parameter in the constructor? Does it compile if you don't use an abstract class in the template?
Looks like I'm sending you in the wrong direction, the following compiles fine in 2008:
class thing {
public:
static void hash( short sht ) {
}
void hash( long lng ) {
}
};
class thing2 {
public:
thing2( void (short ) ){}
};
int _tmain(int argc, _TCHAR* argv[])
{
thing2* t = new thing2( &thing::hash );
delete t;
return 0;
}
The principle remains though, remove/replace complex elements until you have code that compiles and you'll know what is causing the problem.
fatal error C1001: An internal error has occurred in the compiler.
1>(compiler file 'f:\dd\vctools\compiler\utc\src\p2\p2symtab.c
i also observed the same error when i try to build my vs 2005 code to vs 2008. but it happen till i have not installed Service pack of VS 2008...
have you installed Service pack... i think this will resolved your issue....
This typically happens with template instantiation. Unfortunately it could be caused by many things, but 99% of the time your code is subtly invoking undefined behavior.