VS 2005를 사용하여 만든 프로젝트를 VS2012로 마이그레이션 하는 도중 템플릿 사용 부분에서 에러가 발생했습니다.

 

제가 겪은 에러가 이미 다른 사람들도 경험을 했고 MSConnect 사이트에 해결 책이 있어서 공유합니다.

 

struct default_policy

{

    template<class T>

    struct apply

    {

        typedef T type;

    };

};

 

template<class Policy=default_policy>

struct Def

{

    typedef Policy policy;

    typedef Def<policy> thisClass;

 

    typedef typename policy::apply<thisClass>::type type; // syntax error '<'

};

 

void main()

{

}

위 코드에서 typedef typename policy::apply<thisClass>::type type; 부분에서 에러가 발생합니다.

 

이것은 VC11의 문제가 아니고 위 코드가 표준을 지키지 않아서 발생한 문제입니다.

 

해결책은 아래와 같습니다(간단합니다)

struct default_policy

{

    template<class T>

    struct apply

    {

        typedef T type;

    };

};

template<class Policy=default_policy>

struct Def

{

    typedef Policy policy;

    typedef Def<policy> thisClass;

    typedef typename policy::template apply<thisClass>::type type;

};

 

 

typedef typename policy::apply<thisClass>::type type;

이것을 아래와 같이 바꾸면 됩니다.

typedef typename policy::template apply<thisClass>::type type;

 

 

출처 : http://connect.microsoft.com/VisualStudio/feedback/details/745629/typename-template-bug-in-c-compiler-in-visual-studio-2012-rc

 

 

저작자 표시
신고
by 흥배 2012.11.27 08:00

C++11(새로운 C++ 표준의 이름) enum은 지금(C++03)과 다르게 두 가지의 enum이 있습니다.

바로 unscoped enumeration과 scoped enumeration 입니다.

 

 

unscoped enumeration

unscoped enumeration은 기존의 enum과 비슷한 것 이라고 생각 하면 좋을 것 같습니다.^^

 

 

unscoped enumeration은 아래와 같이 정의하고 사용합니다.

 

enum ITEMTYPE : short

{

   WEAPON,

   EQUIPMENT,

   GEM       = 10,

   DEFENSE,      // C++03까지는 에러이지만 C++11에서는 에러가 아님

};

 

사용은 아래와 같이

short ItemType = WEAPON;

 또는

short ItemType = ITEMTYPE::WEAPON; // C++03에서는 에러

 

 


scoped enumeration 

scoped enumeration은 아래와 같이 정의하고 사용합니다.

enum class CHARACTER_CLASS : short

{

           WARRIOR                    = 1,     

           MONK,

           FIGHTER,

};

 

사용은 아래와 같이 합니다.

CHARACTER_CLASS CharClass = CHARACTER_CLASS::WARRIOR;

 

그러나 아래는 에러입니다.

short CharClassType = FIGHTER; // 에러

 

scoped enumeration unscoped enumeration와 다르게 CHARACTER_CLASS를 생략하면 안됩니다즉 WARRIOR 이나 MONK는 CHARACTER_CLASS의 범위 안에 있음을 가리킵니다.

 

그리고 enum class 대신 enum struct을 사용해도 괜찮습니다또 타입을 지정하지 않으면 기본으로 int 타입이 됩니다.

 

 

 

형 변환

unscoped enumeration은 기존과 같이 암묵적으로 정수로 변환할 수 있습니다.

int i = WEAPON;

 

그러나 scoped enumeration은 명시적으로 타입 캐스팅을 해야합니다.

int i = static_cast<int>( CHARACTER_CLASS::WARRIOR);

 

 

 

< 예제 >

#include <iostream>

 

// unscoped enumeration

enum ITEMTYPE : short

{

           WEAPON,

           EQUIPMENT,

           GEM                          = 10,

           DEFENSE,

};

 

// scoped enumeration

enum class CHARACTER_CLASS : short

{

           WARRIOR                    = 1,     

           MONK,

           FIGHTER,

};

 

enum struct BATTLE_TYPE : short

{

           DEATH_MATCH              = 1,     

           TEAM,

};

 

int main()

{

           // unscoped enumeration

           std::cout << "ITEM WEAPON Type 번호 : " << ITEMTYPE::WEAPON << std::endl;

 

           short ItemType = EQUIPMENT;

           std::cout << "ITEM EQUIPMENT Type 번호 : " << ItemType << std::endl;

 

 

 

           /// scoped enumerations

           short CharClassType3 = (short)CHARACTER_CLASS::FIGHTER;

 

           CHARACTER_CLASS CharClass = CHARACTER_CLASS::WARRIOR;

          

           //short   CharClassType    = FIGHTER;                                  // 에러                                            

 

           //short   CharClassType2   = CHARACTER_CLASS::FIGHTER; // 에러

          

           //CHARACTER_CLASS       CharClass2    = WARRIOR;            // 에러

                            

           return 0;

}

 

 

저작자 표시
신고
by 흥배 2012.07.19 09:00

예전에  http://jacking.tistory.com/154 이 글을 통해서 간단하게 VC++의 연관 컨테이너의 성능을 테스트해 본적이 있습니다.

그 때는 VC++ 9 환경에서 테스트를 했는데 이번에는 VC++ 11(RC)에서 테스트 해 보았습니다.

그때 사용했던 코드를 거의 그대로 사용했습니다(그래서 손 볼 것이 좀 있습니다^^;)


성능은 역시나(?) CAtlmap이 제일 빠릅니다. 또 unordered_map이 이전에 비해서 많이 빨라졌네요

일전에 VC++ 팀 블로그에서 성능이 개선되었다고 하던데 맞네요


코드를 올리니 혹시 관심 있는 분들은 좀 더 다양하게 테스트 해보시고 공유 부탁합니다^^





ContainerPerformance.zip


저작자 표시
신고
by 흥배 2012.07.05 09:00
| 1 |