2012-06-27 2 views
-2

다음 코드는 작성되지 않습니다.벡터가 열거 형으로 초기화 됨

struct some_struct { 
    some_struct() { 
     ... do something here to specify size of v; how ?? 
    } 
    enum { 
     ZERO, 
     ONE, 
     TWO 
    }; 

    static std::vector<std::string> v(TWO); 
}; 

아무 생각해도 이해할 수 없습니다.이 제품은 불법 사용을 권장하지 않습니다.

오타가 : 벡터 구문과 보정을 고정 :

error C2061: syntax error : identifier 'TWO' 

또한 편집 :

그것은처럼 보이는 난 단지 2010 요구하는 사람들에 대한 오류 메시지, 2005/2008에없는 테스트 한 컴파일러는 vstd::vector<std::string> 유형을 반환하는 함수라고 생각합니다. 이 모든 것들은 struct 안에 있습니다. (더 자세히 설명하기 위해 게시물을 수정했습니다). 아마도 타입에 혼란스럽고 크기를 생성자의 어딘가에 선언하는 크기 인수를 생략해야할까요? 이 벡터는 구조체의 정적 데이터 멤버가 될 것입니다. 컴파일러에서이를 이해하도록하려면 어떻게해야합니까?

참고 : Linux에서 필자는 구조체가없는 원래의 코드와 비슷한 독립 실행 형 코드를 테스트하여 Linux에서이 수정 사항을 사용하지 않고 컴파일하지 않을 수도 있습니다. 그래서 나는 리눅스에서 OK를 만들었다는 코멘트를 삭제했다. 사과.

+0

오류 메시지가 무엇입니까? 분명한 오류 (벡터에 지정된 유형 없음)를 수정하면 VS2010에서 정상적으로 컴파일됩니다. –

+3

나는 그것이 어떤 플랫폼이나 컴파일러에서 컴파일 될지 의심 스럽다. 벡터의 유형을 지정해야합니다. –

+0

@ LuchianGrigore, 처음에 나는 그것이 가장 귀찮은 구문일지도 모른다고 생각했지만, 시도는 당신이 옳았다는 것을 보여 주었다. http://ideone.com/ccTWv –

답변

2

클래스 선언에서 클래스 멤버를 초기화 할 수 없습니다. 외부에 인스턴스화해야합니다.

#include <vector> 
#include <string> 

struct some_struct { 
    some_struct() { 
    } 
    enum { 
     ZERO, 
     ONE, 
     TWO 
    }; 

    static std::vector<std::string> v; 
}; 

std::vector<std::string> 
some_struct::v = std::vector<std::string>(TWO); 

int main() {} 
+0

표준 생성자 "명시 적 벡터 (size_type n, const T & value = T(), const Allocator & = Allocator());"를 사용해야합니다. 아마도 Visual C++에는 그러한 것이 없을 것입니다. –

+0

흠 .. 원래의 게시물에 많은 수정/설명을했는데 (세부 사항이 전혀 없음) 친절하게 또 한번보세요. –

+0

또는 아마도 Visual C++ 자동으로 enum 값을 size_type 변환하지 않습니다. std :: vector :: size_type은 "구현 정의"이므로 변환하지 않는 것이 합법적 일 수 있습니다. –

0

참고 : OP의 원래 질문에 대한 수정으로 다음 사항이 모두 무효화됩니다.

모두는 vector의 정의가있는 위치에 따라 다릅니다. vector<> 템플릿 (또는 더 최근에는 std::vector<> 템플릿)을 정의하는 표준 C++ #include 파일을 포함한다면 템플릿으로 정의되었지만 유형이 제공되지 않으므로 오류가 발생합니다. 당신이 어딘가에 길을 따라 표준 파일을 포함하지 않은 경우는 다른 곳에서 벡터의 정의를 얻고, 주님 만이 기대 생성자 인자의 어떤 종류를 알고,

std::vector<int> v; 

: 그것은 뭔가를 기대하고있다.

어쨌든 클래스로서의 벡터는 비표준이며 선언 및 구현이 환경에 따라 다르거 나 전혀없는 경우 놀라운 일이 아닙니다.

+0

'std :: vector'는 확실히 표준에 있습니다.그 대답의 나머지도 잘못되었습니다. – ssube

+0

예, 그렇습니다. 나는 어딘가 다른 곳에서 제안 했는가? –

+1

마지막 비트는 "어쨌든, 클래스의 벡터는 비표준입니다 ..."로 시작합니다. "std :: vector는 항상 클래스입니다. – ssube

0

그런 헤더에서 벡터를 초기화 할 수 없습니다. 이 정적이기 때문에 당신은 그것을 선언 장소에서, 소스 파일에 작업을 수행합니다

std::vector<std::string> some_struct::v(TWO); 

가 고정되지 않은 경우 클래스 생성자의 초기화 목록에 그것을 할 것입니다.

+0

누가 헤더에서 말했나요? 이것은 구현 (CPP)에 있습니다. 구조체는 다른 클래스의 private 멤버입니다. –

+0

@ squashed.bugaboo, 보통 클래스 선언은 헤더에 들어 있으므로 방금 가정했습니다. 내 요점은 정적'v' 멤버를 클래스 선언에서 선언하고 클래스 선언 외부에서 다시 정의해야한다는 것입니다. –

관련 문제