Pergunta

C++ parece ser um tanto rabugento ao declarar modelos em vários arquivos.Mais especificamente, ao trabalhar com classes de modelo, o vinculador espera todas as definições de método da classe em um único arquivo-objeto do compilador.Quando você leva em conta cabeçalhos, outras declarações, herança, etc., as coisas ficam realmente confusas.

Há algum conselho geral ou solução alternativa para organizar ou redistribuir definições de membros de modelo em vários arquivos?

Foi útil?

Solução

Há algum conselho geral ou solução alternativa para organizar ou redistribuir definições de membros de modelo em vários arquivos?

Sim;não.

A especificação C++ permite que um compilador seja capaz de "ver" o modelo inteiro (declaração e definição) no ponto de instanciação e (devido às complexidades de qualquer implementação) a maioria dos compiladores mantém esse requisito.O resultado é que #inclusão de qualquer cabeçalho de modelo também deve #incluir toda e qualquer fonte necessária para instanciar o modelo.

A maneira mais fácil de lidar com isso é despejar tudo no cabeçalho, embutido quando possível, fora de linha quando necessário.

Se você realmente considera isso uma afronta inaceitável, uma opção comum é dividir o modelo no par cabeçalho/implementação usual e, em seguida, #incluir o arquivo de implementação no final do cabeçalho.

O recurso de "exportação" do C++ pode ou não fornecer outra solução alternativa.O recurso é mal suportado e mal definido;embora em princípio deva permitir algum tipo de compilação separada de modelos, isso não evita necessariamente a exigência de que o compilador seja capaz de ver todo o corpo do modelo.

Outras dicas

Em quantos arquivos?Se você deseja apenas separar as definições de classe da implementação, tente Este artigo nas perguntas frequentes sobre C++.Essa é a única maneira que conheço que funciona no momento, mas alguns IDEs (Eclipse CDT, por exemplo) não vinculam esse método corretamente e você pode receber muitos erros.No entanto, escrever seus próprios makefiles ou usar Visual C++ sempre funcionou para mim :-)

Quando/se o seu compilador suportar C++0x, o extern palavra-chave pode ser usada para separar declarações de modelo de definições.

Ver aqui para uma breve explicação.

Além disso, a seção 6.3, "O Modelo de Separação", do Modelos C++:O guia completo por David Vandevoorde e Nicolai M.Josuttis descreve outras opções.

alt text

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