Celebrate National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

definition error in visual studio C++

Posted on 2014-01-18
8
Medium Priority
?
774 Views
Last Modified: 2014-01-21
hi


I seem to be getting the following error all of a sudden when trying to compile my code. I dont fully understand what it means. The part that is really confusing is that I have not made any changes to the A.h file or included it specifically anywhere between the last compiling stage and the current non-compilable stage. Any ideas how this might have come  up andhow i can  fix this?

c:\A.h(107) : error C2766: explicit specialization; '`anonymous-namespace'::ctti<int>' has already been defined
3>        c:\A.h(95) : see previous definition of 'ctti<int>'

Find Results 1, "Entire Solution"
  C:\A.h(95):template<> struct ctti<int> : ctti_base<int> {


line 95 is
#ifdef DETECTED_OS_WINDOWS
template<> struct ctti<int> : ctti_base<int> {
  typedef unsigned int size_type;
  typedef int  signed_type;
};

line 107 is
template<> struct ctti<boost::int32_t> : ctti_base<boost::int32_t> {
  typedef boost::uint32_t size_type;
  typedef boost::int32_t signed_type;
};
0
Comment
Question by:LuckyLucks
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
8 Comments
 
LVL 32

Expert Comment

by:phoffric
ID: 39791769
I never heard of this error before so I looked it up.
http://msdn.microsoft.com/en-us/library/2x4hcz93.aspx
// C2766.cpp
// compile with: /c
template<class T> 
struct A {};

template<> 
struct A<int> {};                   // specialization #1a

template<> 
struct A<int> {};   // C2766     // specialization #1b
// try the following line instead
// struct A<char> {};     // specialization #2

Open in new window

Specializations 1a and 1b are obviously duplicates, so #2 could be used instead.

Now back to your case. My guess is that struct ctti<int>  and struct ctti<boost::int32_t> are seen by the compiler on your system as the same in that if your system has int as a 32 bit word, then that is the same as boost::int32_t.
Just a guess.

Other wild guess is to make sure that you have guards around all your header files.
0
 
LVL 35

Expert Comment

by:sarabande
ID: 39793997
Other wild guess is to make sure that you have guards around all your header files.
the guess is good and by my experience the more reasonable issue.

if the a.h was not "protected" by a

#pragma once 

Open in new window

statement or by macros like

// a.h
#ifndef A_H
#define A_H
// put here the current contents of the header 
...
#endif // A_H

Open in new window

the template definition would be defined twice when the a.h was included in two source files.

// b.h
....
#include "a.h"
...

// b.cpp
...
#include "b.h"
#include "a.h"   
...

Open in new window

when including a.h the second time the error could occur when a.h is not protected.

Sara
0
 

Author Comment

by:LuckyLucks
ID: 39795952
i put in #pragma once in A.h - did not change the error.

I notcied something interesting though.
I tried to reproduce the errror by slowly adding code that i thought might introduce the error in the first place.


Seems when I add the below line of code to one of my other header files C.h (not related or refering to A.h in any way) ,
std::tr1::unordered_map<size_t,std::vector<UINT64>> myhash;
I get this error.

What's strange is if i comment out the line, the error does not go away.

What causes the compiler to not let go of this error?
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 32

Expert Comment

by:phoffric
ID: 39796127
try changing line 107 to use <boost::uint32_t> instead of <boost::int32_t>.
0
 

Author Comment

by:LuckyLucks
ID: 39797686
is there an easier way to find out which header file it's definition is being picked up first? Going through all the headers in the headers  seem a really painful way to go in a big project.
0
 
LVL 32

Accepted Solution

by:
phoffric earned 2000 total points
ID: 39798654
Not sure if this will help you. In Visual Studio, there are two toggles with regards to headers. In project properties, under Configuration Properties -> C/C++:
Preprocessor -> Preprocess to a File -> Yes (/P)
The (/P) provides a text .i file which shows what the compiler processes.

Advanced -> Show Includes -> Yes (/showIncludes)
As you compile, the headers that are included are shown as they are included by the preprocessor.

I would work with them one at a time, and compare the results to make sure that you understand the outputs.
0
 

Author Comment

by:LuckyLucks
ID: 39799003
@phoffric : thanks! there is a certain third party header file that is being included at numerous places. I am surprised that the compiler has not complained at the 2nd instance it was included but instead much later.
0
 
LVL 32

Expert Comment

by:phoffric
ID: 39799011
Glad you were able to figure it out. Lord knows, we tried, but without a little more source code, all we could do is WAG. You asked the right question to narrow down the problem. Nice going.

Paul
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Unlike C#, C++ doesn't have native support for sealing classes (so they cannot be sub-classed). At the cost of a virtual base class pointer it is possible to implement a pseudo sealing mechanism The trick is to virtually inherit from a base class…
Container Orchestration platforms empower organizations to scale their apps at an exceptional rate. This is the reason numerous innovation-driven companies are moving apps to an appropriated datacenter wide platform that empowers them to scale at a …
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.
Suggested Courses

730 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question