문제

MSVC6에서 MSVC 2008로 전환하려고 시도하는 동안 지속적으로 내부 컴파일러 오류가 발생합니다.프로그램의 여러 부분을 주석 처리한 후 두 개의 다른 CPP 파일에 있는 두 줄의 코드에서 오류를 추적했습니다.이 두 CPP 파일은 모두 성공적으로 컴파일되지만 오류가 다른 파일에 나타나는지 여부에 영향을 미칩니다.

두 줄 모두 여러 개의 복잡하고 중첩된 템플릿을 인스턴스화하는 작업이 포함됩니다.또한 추상 클래스를 템플릿 매개변수 중 하나로 사용하는 앱의 유일한 위치인 것으로 보입니다.즉, 문제가 추상 클래스나 템플릿과 관련되어 있는지 확신할 수 없습니다. 이는 제가 본 것 중 가장 분명한 것입니다.나는 이 선들이 전혀 의미가 있는지조차 확신할 수 없습니다.하지만 그 모습은 다음과 같습니다.

m_phDSAttributes = new SObjDict<RWCString, SIDataSource>(&RWCString::hash);

따라서 템플릿화된 사전 클래스인 SObjDict, 추상 인터페이스인 SIDataSource가 있고 매개변수는 RWCString의 정적 멤버 함수에 대한 포인터입니다.

코드를 좀 가지고 놀다가 가끔 한 CPP 파일에서 다른 CPP 파일로 이동할 때 오류가 발생할 수 있습니다(예를 들어 여러 템플릿 선언을 사용에서 변경했습니다). class 에게 typename), 하지만 운율이나 이유를 찾을 수 없습니다.

이 문제를 더 디버깅하는 방법을 모르겠습니다.컴파일러의 정확한 오류 출력(소스 파일 이름이 변경됨)은 다음과 같습니다.인터넷 어디에도 언급이 없습니다.진행 방법에 대한 조언이 절실히 필요합니다.누군가가 "오, XYZ만 하면 됩니다"라고 말할 것이라고는 기대하지 않지만, 이런 종류의 문제를 디버깅하는 방법에 대한 조언을 주시면 매우 감사하겠습니다.

1>d:\Dev\webapi.cpp : fatal error C1001: An internal error has occurred in the compiler.
1>(compiler file 'f:\dd\vctools\compiler\utc\src\p2\p2symtab.c', line 5905)
도움이 되었습니까?

해결책

나는 내 자신의 질문에 대답하고 받아들이는 것을 다소 나쁘게 느낀다. 그러나 나는 그것이 옳은 일이라고 생각한다 ... 나는 적어도 일시적으로 내 문제를 해결했다. 트릭은 사전 컴파일 된 헤더를 비활성화하는 것 같습니다. 나는 모른다 그것은 문제를 해결하고, 영향을받는 프로젝트의 빌드 시간이 30 초 미만에서 거의 5 분으로 사라 졌기 때문에 매우 불행한 일이지만, 최소한 앞으로 나아갈 수 있습니다 ... 누군가가 더 영구적 인 솔루션을 생각해 내면 나는 I 'D는 받아 들여진대로 그들의 답을 표시하는 것이 더 행복합니다.

다른 팁

그것을 가정하는 것은 합리적인 내기입니다 p2symtab.c 기호 테이블 코드의 일부입니다. 이것은 업그레이드가 어떻게 발생했는지 즉시 설명 할 것입니다. 이 코드가 다시 작성되었습니다. (VC6의 255 문자 길이 경고를 기억하십니까?)

이 경우 심볼 테이블에 새 항목이 없으므로 Symbol Table에서 Spectularly가 실패 할 수 있습니다. 이름 조회가 발생하는 컨텍스트가 결과에 영향을 미치는지 확인하는 것이 흥미로울 것입니다. 예를 들어, 코드를 변경하면 어떻게됩니까?

typedef SObjDict<RWCString, SIDataSource> SObjDict_RWCString_SIDataSource;
m_phDSAttributes = new SObjDict_RWCString_SIDataSource(&RWCString::hash);

이것은 또 다른 심볼 테이블 항목을 만들게됩니다. SObjDict_RWCString_SIDataSource. 이 항목은 템플릿에 대한 일종의 상징적 링크입니다. 인스턴스화. 새로운 이름은 그 자체로 찾아 볼 수 있습니다.

그것을 더 작은 부분으로 나누기 시작하십시오.내 첫 번째 추측은 정적 함수에 대한 포인터가 문제가 될 것이라는 것입니다.생성자에서 동일한 매개변수를 사용하여 더미 비템플릿 클래스를 만들 수 있습니까?템플릿에서 추상 클래스를 사용하지 않으면 컴파일됩니까?

내가 잘못된 방향으로 여러분을 보내는 것 같습니다. 다음은 2008년에 잘 컴파일됩니다.

class thing {
public:
    static void hash( short sht ) {
    }

    void hash( long lng ) {
    }
};

class thing2 {
public:
    thing2( void (short ) ){}
};

int _tmain(int argc, _TCHAR* argv[])
{
    thing2* t = new thing2( &thing::hash );
    delete t;
    return 0;
}

하지만 원칙은 여전히 ​​남아 있습니다. 컴파일되는 코드가 있고 문제의 원인이 무엇인지 알 수 있을 때까지 복잡한 요소를 제거/교체해야 합니다.

치명적인 오류 C1001 : 컴파일러에서 내부 오류가 발생했습니다. 1> (컴파일러 파일 'f : dd vctools compiler utc src p2 p2symtab.c

또한 VS 2005 vs 2008에 대한 2005 코드를 빌드하려고 할 때도 동일한 오류를 관찰했습니다. 그러나 VS 2008의 서비스 팩을 설치하지 않을 때까지 발생합니다 ...

서비스 팩을 설치 했습니까? 이것이 문제를 해결할 것 같아요 ....

이것은 일반적으로 템플릿 인스턴스화에서 발생합니다. 불행히도 그것은 많은 것들에 의해 야기 될 수 있지만, 코드가 정의되지 않은 동작을 미묘하게 호출하는 시간의 99%.

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