Pergunta

Eu estou correndo de forma consistente em um erro interno do compilador durante a tentativa de mudar de MSVC6 para MSVC 2008. Depois de muito trabalho comentando diferentes partes do programa, já traçou o erro para duas linhas de código em dois arquivos CPP diferentes . Ambos os arquivos CPP compilação com êxito, mas de alguma forma ter um efeito sobre se ou não os manifestos de erro em outros arquivos.

Ambas as linhas envolvem instantianting vários, modelos aninhados complexos. Eles também parecem ser os únicos lugares no aplicativo que usam uma classe abstrata como um dos parâmetros do modelo. Dito isto, eu estou longe de ser certo que a questão envolve aulas tanto abstratas ou modelos, é apenas a coisa mais óbvia que eu notei. Eu não posso sequer ter a certeza que estas linhas são significativos em tudo. Aqui está o que eles se parecem, no entanto:

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

Então, temos SObjDict, uma classe dicionário templatized, SIDataSource, uma interface abstrata, eo parâmetro é um ponteiro para uma função de membro estático de RWCString.

Eu fui brincar com o código de alguns, e eu ocasionalmente pode obter o erro de passar de um arquivo CPP para outro (por exemplo, eu mudei um monte de declarações modelo de usar class para typename), mas eu posso 't encontrar qualquer rima ou razão a ele.

Eu estou em uma perda a respeito de como depurar ainda mais esta questão. A saída de erro exata pelo compilador (com o nome do meu arquivo de origem alterado) está abaixo. Não há menção a ele em qualquer lugar na internet. Estou bastante desesperada para qualquer conselho sobre como proceder. Eu não espero alguém para dizer "oh, você só precisa fazer XYZ", mas um ponteiro sobre a forma de depurar este tipo de problema seria muito apreciada.

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)
Foi útil?

Solução

Eu me sinto um pouco mal colocar uma resposta sobre a minha própria pergunta e aceitá-lo, mas eu acho que é a coisa certa a fazer ... Eu resolvi meu problema, pelo menos temporariamente. O truque parece ser incapacitante cabeçalhos pré-compilados. Eu não tenho idéia por que resolve o problema, e é muito infeliz desde o meu tempo de construção para o projeto afetada passou de menos de 30 segundos para cerca de 5 minutos, mas pelo menos eu posso progredir para a frente .. . Se alguém surge com uma solução mais permanente, eu ficaria mais do que feliz para marcar sua resposta como aceite.

Outras dicas

É uma aposta razoável supor que p2symtab.c é (parte do) o código de tabela de símbolos. Isto imediatamente explicar como a atualização causou; este código foi reescrito. (Lembre-se das advertências de comprimento de 255 caracteres de VC6?)

Neste caso, não há nova entrada na tabela de símbolos, por isso é provável uma pesquisa na tabela de símbolos não spectactularly. Seria interessante ver se o contexto em que th pesquisa de nome acontece afeta o resultado. Por exemplo, o que acontece se você alterar o código para

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

Isto irá forçar outra entrada símbolo tabela a ser criada, por SObjDict_RWCString_SIDataSource. Esta entrada é uma espécie de um link simbólico para o modelo instanciação . O novo nome pode (e deve) ser olhou para cima por conta própria.

Iniciar dividi-lo em partes menores. Minha primeira suposição é o ponteiro para a função estática vai ser o problema. você pode fazer uma classe não-modelo fictício com o mesmo parâmetro no construtor? Será que compilar se você não usar uma classe abstrata no modelo?

Parece que eu estou te mandando na direção errada, o seguinte compila bem em 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;
}

o princípio permanece, porém, remover / substituir elementos complexos até que você tem o código que compila e você vai saber o que está causando o problema.

erro fatal C1001: Um erro interno ocorreu no compilador. 1> (compilador arquivo 'F: \ dd \ vctools \ compilador \ UTC \ src \ p2 \ p2symtab.c

i também observou o mesmo erro quando eu tento construir minha vs código 2005 para vs 2008. Mas isso acontecer até que eu não tenha instalado o Service pack of VS 2008 ...

tem de ter instalado o Service pack ... Acho que isso vai resolver o seu problema ....

Isso normalmente acontece com instanciação de modelo. Infelizmente, pode ser causada por muitas coisas, mas 99% do tempo o seu código é sutilmente invocando um comportamento indefinido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top