문제

프로그램이 실행될 때 벡터 유형을 설정 해야하는 프로그램이 있습니다 (구성 파일의 값에 따라).

나는 이것을 시도했다 :

int a = 1

if(a == 1)  vector<int> test(6);
else  vector<unsigned int> test(6);

test.push_back(3);

그러나 이것은 나에게 제공한다 :

Error   1   error C2065: 'test' : undeclared identifier

이유는 확실하지 않지만 벡터가 실제로 컴파일 타임에 결정되지 않았기 때문에 컴파일러가 나머지 코드를 컴파일하는 동안 컴파일러가 작동 할 수 없기 때문이라고 생각합니다.

위에서 시도한 것과 비슷한 런타임에 벡터 유형을 결정하는 방법이 있습니까? IF 외부에서 하나의 버전을 만들려고 시도한 다음 삭제하고 IF 내부의 새 버전을 다시 작성하려고했습니다. 그러나 이것은 잘못된 느낌이 들며 어쨌든 일할 수 없습니다. 감사해요.

도움이 되었습니까?

해결책

작동하지 않는 이유는 IF- 및 Else 블록 내부의 벡터를 각각 선언하므로 블록이 끝나면 범위를 벗어나기 때문입니다.

위에서 시도한 것과 비슷한 런타임에 벡터 유형을 결정하는 방법이 있습니까?

아니요, 변수의 유형은 컴파일 타임에 알아야합니다. 유일한 선택은 줄을 올리는 것입니다 test.push_back(3) 액세스하는 다음 코드뿐만 아니라 test if- 및 else- 블록으로 또는 두 번째 템플릿 기능으로의 코드 복제를 피합니다. 이것은 다음과 같이 보일 수 있습니다.

template <class T>
do_something_with_test(vector<T>& test) {
    test.push_back(3);
    // work with test
}

void foo() {
    int a = 1

    if(a == 1) {
        vector<int> test(6);
        do_something_with_test(test);
    }
    else {
        vector<unsigned int> test(6);
        do_something_with_test(test);
    }
}

다른 팁

당신이 얻는 오류의 정확한 이유는 초보자에게 미묘한 것이며 변수의 범위를 포함합니다. test 당신이 창조하고 있습니다. 간단히 말해서, 당신은 if 문의 내부에 벡터를 생성하고 있지만, 그것을 사용할 때까지, 그것은 범위를 벗어 났기 때문에 더 이상 존재하지 않습니다.

나는이 효과를 더욱 눈에 띄게 만들기 위해 괄호로 코드를 재구성했습니다. 내 버전은 의미 적으로 동일하며 동일한 오류가 발생합니다.

if(a == 1)
{
  vector<int> test(6);
}
else
{
  vector<unsigned int> test(6);
}

test.push_back(3);

즉, 당신이하려는 것은 조금 이상하게 보이며, 나는 당신의 최종 목표가 무엇인지 궁금해해야합니다. 그것은 당신이하고 싶은 일을 할 수있는 방법이 없다고 말하는 것이 아니라, 더 적절한 방법을 제안하기 전에 성공 기준이 무엇인지 알아야합니다.

왜 필요한지 잘 모르겠지만, 나는 당신이 당신의 문제를 해결하기 위해 유니언의 벡터를 사용하려고 노력할 것을 제안합니다.

union DataType
{
    int intVal;
    unsigned uintVal;
}
std::vector<DataType> vec;

또는 아마도 더 우아한 방법은 사용하는 것입니다 부스트 :: 변형 노조 대신. 어쩌면 당신이 당신의 문제에 대한 자세한 내용을 우리에게 줄 수 있다면 당신은 훨씬 더 나은 asnwer를 얻을 수 있습니다.

행운을 빕니다!

당신은 볼 수 있습니다 부스트 :: 누구 비슷한 것을 달성하기 위해.

벡터 유형 설정 (일명 템플릿 인스턴스화) 항상 컴파일 시간에 발생합니다. 자세한 설명은 Wikipedia 기사를 확인하십시오 템플릿 메타 프로 그램.

진정으로 다형성 유형이 필요하다면 아마도 부스트 :: 변형 클래스 또는 이와 유사한 것을 볼 수 있습니다.
이것은 C ++ 내 동적 언어의 일부 동작을 모방하도록 설계되었으며 일반적으로 이들과 인터페이스 (또는 구현)에 사용됩니다. "벡터 <variant> a"및 a.push_back (variant ((unsigned int)).

값이 균질 할 것으로 예상되는 경우 전체 컬렉션의 유형 정보를 저장하는 벡터 화 된 변형 클래스를 만들 수도 있습니다.

그러나 그러한 메커니즘없이 원하는 최종 결과를 달성하고 런타임 유형 검사를 피하기 위해 프로그램을 재 작업 할 수 있습니다 (처음에는 다른 언어보다 C ++를 사용하는 이점 중 일부를 무효화 할 가능성이 높습니다).

유형 종속 부품을 템플릿으로 작성하고 (위의 제안대로) 확인 및 디스패치 된 구성 파일 설정을 기반으로 대체 코드 경로를 선택할 수 있습니다. 이 스타일의 코딩은 'Auto'및 Decltype ()를 사용하여 C ++ 0X에서 약간 쉬워집니다.

서명되지 않은 값과 서명되지 않은 값의 특정 사례는 추가 된 복잡성에 비해 특이한 소리 또는 한계 이익의 한 비트를 더 허용하는 것이 포함되지만, 예를 들어 단일 및 이중 정밀 플로트 사이에서 전환 할 수있는 구현을 원하는 하나를 쉽게 상상할 수 있습니다.

또 다른 간단한 옵션은 유형에 대한 컴파일 시간 설정 (예 : 빌드 설정 또는 makefile에서 정의로 도입)을 만들고 프로그램의 여러 버전을 배포하는 것입니다. 그러나 이미 제안한 템플릿이 가장 유용한 옵션 일 가능성이 높습니다.

예에서는 변수의 독립적 인 인스턴스가 있습니다. test 귀하의 각 지점에서 만들어졌습니다 if 진술은 각각 즉시 범위를 벗어납니다. 컴파일러가 도착하면 test.push_back(3); 아니요 test 범위가 변수하므로 오류입니다.

문제를 해결하려면 유형 시스템과 싸울 수 없습니다. int 그리고 unsigned int 문제의 실제 유형은 사용하지 않는 것이 훨씬 좋습니다. vector<int> 전체적으로, 당신은 실제로 서명되지 않은 int의 전체 범위가 필요하지 않다고 가정합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top