2009-10-26 3 views
1

아래 코드에서 다음 오류가 발생합니다.전역 수준에서 인스턴스화 (C++)

expected constructor, destructor, or type conversion before '=' token 

-

#include <string> 
#include <map> 

class Foo { 

}; 

std::map<std::string, Foo> map; 
map["bar"] = Foo(); 

int main() 
{ 

    return 0; 
} 
+2

문제는 "글로벌 수준에서 인스턴스화"하지 않고 "글로벌 수준에서 진술을 실행하려고합니다"입니다. 넌 그럴 수 없어, 미안. –

답변

13
전까지 C++ 0X가 주류가된다
map["bar"] = Foo(); // This line is a statement not a declaration. 
        // You have to put it in main, or any execution context 

, 나는 boost을 사용하는 것이 좋습니다 것입니다. map을 채우는 것은 케이크 조각이됩니다. 다음은 예입니다.

std::map<std::string, Foo> mymap; 
... 
int main() 
{ 
    insert(mymap) 
    ("First", Foo(...)) 
    ("Second", Foo(...)) 
    ("Third", Foo(...)); 
    ... 
} 
1

정적 초기화 도구가 필요합니다. this을 읽어 보시기 바랍니다. 정적 이니셜 라이저의 사용과 정적 인 초기화 순서에 대한 설명.

+2

왜 downvotes? 적어도 건설적인 코멘트를 남겨주세요. –

+0

나는 당신을 downvote하지 않았다, 그러나 나는 너의 것이 좋은 대답이 아닌 이유를 본다라고 생각한다. 그것은 그 문제를 다루지 않습니다. 정적 초기화와 주문 위험은 자신의 질문에 대한 답변의 일부일 수 있지만이를 포함시키지 않았습니다. –

+0

C++에는 정적 초기화 프로그램과 같은 것이 없습니다. 전역은 생성자에 의해 초기화됩니다. 또한 링크 된 기사는 끔찍하고 정말로 나쁜 충고로 가득차 있습니다. –

4

간단한 답은 이전에 보았 듯이 할 수 없습니다.

나는 당신이 정말 원하는 것은이 생각 :

std::map<std::string, Foo> map; 

int main() 
{ 
    map["bar"] = Foo(); 

당신은 종종 다음과 같은 예를 볼 수 main() 전에 정말는 실행 초기화를해야하는 경우 :

namespace { 
    struct StaticInitHelper { 
     StaticInitHelper() { map["bar"] = Foo(); } 
    } _helper_obj; 
} 

을하지만, 지금 map_helper_obj 전에 만들어지지 않는다는 새로운 문제가 있습니다. 이 문제를 해결하는 한 가지 방법은 다음과 같습니다.

namespace { 
    struct StaticInitHelper : public std::map<std::string, Foo> { 
     StaticInitHelper() { (*this)["bar"] = Foo(); } 
    } map; 
} 

STL 컨테이너 클래스에서 상속하는 것은 일반적으로 권장되지 않습니다. 이 예제는 다른 생성자를 숨기고 STL 기본 클래스에는 가상 소멸자가 없다는 점에 유의하십시오. 이것은 많은 사람들에 의해 "해킹"으로 간주 될 것이므로 반드시 피해야합니다.

는 또 다른 대안은 std::map으로 클래스를 정의하는 것입니다

namespace { 
    struct StaticInitHelper { 
     StaticInitHelper() { map["bar"] = Foo(); } 
     std::map<std::string, Foo> map; 
    } map_holder; 
} 

map_holder.map.find(... 

그러나 물론이지도의 사용을 복잡하게한다.

업데이트 :

나는 boost::assign를 사용하여, 다른 옵션을 언급하는 것을 잊었다 :

#include <boost/assign/list_of.hpp> 

map<int,int> map = boost::assign::map_list_of(1,2)(2,3)(3,4)(4,5)(5,6); 

그래도 난 그 정적 객체에 안전 여부에 대한 정보를 찾을 수 없습니다.