2011-08-26 2 views
0

이 구조체가 있습니다. 내가 뭘 하려는지는 하드 드라이브에 memcpy를 계속하기위한 램 공간을 갖는 것이다. 동적으로 생성 된 문자열을 키로 사용합니다. 이 일을 할 수있는 구조체를 만들고 싶습니다. 템플릿을 사용하고 이것을 만들었습니다.가변적으로 수정 된 유형의 char []

template <class ItemType> struct INXM_Node { 
    ItemType key; 
    int left; 
    int right; 
    int next; // Used for queue. 
} ; 

나는 실행했다 : 나는 변수로 100을 변경하려고 할 때까지

INXM_Node<char[100]> *root = new INXM_Node<char[100]>(); 

모든 것이 좋았다. 나는 함수에서 인자로 attrLength을 복용하고

sizeof(INXM_Node<char[attrLength]>); 

: 내가 달릴 무엇

'char [(((long unsigned int)(((long int)attrLength) - 1)) + 1u)]' is a variably modified type 

했다 : 그 때 나는 오류가 발생했습니다. 다른 문자 배열을 사용하여 여러 구조체를 생성해야합니다.

+0

키워드'class','template' 및'new'로 인해 C 태그가 제거되었습니다 – Flexo

+1

컴파일 타임에 유형을 알고 있어야합니다. 즉, 배열 유형은 ** 컴파일시 알려진 크기 **로만 형성 될 수 있습니다. 당신의 디자인 접근법은 아마도 재 작업되어야합니다. 왜 당신의 목표를 게시하지 않습니까? –

답변

1

템플릿을 인스턴스화하는 데 사용하는 유형 은 컴파일시 고정되어야합니다. 템플릿으로 컴파일 할 때 템플릿과 함께 사용하는 다양한 유형의 컴파일러가 특정 코드를 생성합니다. 이것은 런타임에 수행 할 수 없습니다 (컴파일러를 사용할 수 없을 수도 있습니다). 그리고 컴파일 타임에 가능한 모든 유형에 대해 수행하기를 기대하는 것은 비합리적이고 실제로 불가능합니다.

나는 당신이 일반적으로 당신의 문제에 대한 잘못된 접근 방법을 생각하고 있다고 생각합니다. 런타임에 크기가 달라 지도록하려면 std::string을 키로 사용하고 boost::serialize과 같은 것을 사용하여 데이터를 디스크에 안전하게 저장하고 이동하는 것이 좋습니다.

1

문제는 컴파일러가 컴파일시에 어떤 타입인지 알 필요가 있다는 것입니다. 변수를 사용할 때 알 수 없습니다. 컴파일러는 프로그램 실행에 사용될 각 ItemType을 구체적으로 작성하려고 시도합니다. 가변 길이 char 배열을 사용하는 경우 컴파일러는 해당 특정 ItemType에 할당 할 메모리 양을 알지 못합니다. std::string