Pergunta

Estou usando o Codesynthesis XSD C ++/Utilitário de mapeamento de árvores para converter um código XSD existente no código C ++ em que podemos preencher os valores. Isso era sempre garantimos que seguimos o esquema.

Depois de fazer a conversão, estou tentando fazê -la funcionar para que eu possa testá -la. O problema é que não estou acostumado a fazer isso no C ++ e é a minha primeira vez com esta ferramenta.

Começo com uma aula chamada AbstractNetworkModel com tipos versno_type e fromtime_typetypedef'd dentro. Aqui está o construtor que estou tentando usar, bem como os typedefs

ABSTRACTNETWORKMODEL(const versno_type&, const fromtime_type&);
typedef ::xml_schema::double_ versno_type;
typedef ::xml_schema::time fromtime_type;

Tudo isso está na classe AbstractNetworkModel e as definições para duplo_ e tempo são:

typedef ::xsd::cxx::tree::time<char, simple_type> time;
typedef double double_;

Onde a definição para o tempo é uma classe com vários construtores:

template<typename C, typename B>
class time: public B, public time_zone
{
  public:
  time(unsigned short hours, unsigned short minutes, double seconds);
  ...
}

Sei que não estou criando corretamente um novo ABRAWERNETWORKMODEL, mas não sei o que preciso fazer isso. Aqui está tudo o que estou tentando fazer neste momento:

  ::xml_schema::time t();
  ABSTRACTNETWORKMODEL anm(1234, t);

É claro que isso lança um erro sobre a conversão do segundo parâmetro, mas alguém pode me dizer o que está incorreto? Ou pelo menos me aponte no caminho certo, como uma das coisas que estou tentando fazer agora é aprender mais C ++.

Foi útil?

Solução

Já fui mordido por isso antes. Se a linha:

::xml_schema::time t();

é exatamente como aparece no seu código (ou seja, com os parens), então o problema é que você não instanciou um objeto como pensa.

Para instanciar um objeto que você usaria

::xml_schema::time t;

A primeira linha, em vez disso, declara uma função t () que não leva argumentos e retorna um objeto do tipo ::xml_schema::time. Como não há corpo, o compilador pensa que você definirá a função posteriormente. É perfeitamente legal C ++, e é algo que as pessoas fazem muito (digamos, em arquivos de cabeçalho) para que o compilador o aceite, não emite um aviso porque não tem como saber que não é o que você quis dizer e faz algo que você não estava Esperando.

E quando você passa essa função para o ABSTRACTNETWORKMODEL Construtor Você recebe um erro porque não pode passar uma função como um argumento (você pode passar um ponteiro para a função e pode chamar a função, passando o temporário resultante):

::xml_schema::time t();
ABSTRACTNETWORKMODEL anm(1234, t()); // calls t(), gets a temporary of type ::xml_schema::time, and passes the temporary to the constructor

Portanto, a razão "a instanciação do tempo não causou um erro" é que um objeto de tempo nunca foi instanciado. A aula de tempo também não possui um construtor padrão e tentar instanciar a sintaxe correta teria lançado o erro que você esperava.

Para o registro, os parênteses são necessários em alguns casos. Por exemplo, ao instanciar um objeto temporário e manipular esse temporário na mesma linha:

int hours = time().get_hours(); // assuming that there is now a default constructor

Porque a retirada do primeiro conjunto de parênteses resultará em um erro:

int hours = time.set_time("12:00:00am"); // error: there is a time class, but no object named "time"

Acredite, eu realmente gosto do C ++, mas a sintaxe pode ficar realmente difícil de manter em linha reta.

Outras dicas

Perguntado no escritório, e parece que meu problema não estava criando o AbstractNetworkModel, mas na verdade era o :: xml_schema :: time.

Acho estranho que a instanciação do tempo não tenha causado um erro, já que ele não possui nenhum construtores padrão ou por que não foi aceito, mesmo que o modelo e os tipos estivessem corretos.

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