Domanda

che sto facendo alcuni disegni basati su policy qui e ho il bisogno di typedef un sacco di tipi di modello per accorciare i nomi.
Ora il problema nasce che quando ho bisogno di usare un puntatore a uno di quei tipi che cerco di appena avanti dichiararla ma il compilatore si lamenta con un test.cpp:8: error: using typedef-name ‘Test1’ after ‘class’
Non ha niente a che fare con i formati come non ho bisogno del obj a tutti, il suo solo un puntatore in un file ".h" dove non voglio portare l'intero modello in.
Questo è g ++:

//Works
class Test{};
class Test;

//Doesn't work
class Test{};
typedef Test Test1;
class Test1;

Qualsiasi suggerimento?

È stato utile?

Soluzione

Questo è corretto. A nome-typedef non può essere utilizzato in una dichiarazione tali forward (questo è tecnicamente chiamato un indicatore di tipo elaborata, e se tale specificatore risolve un nome-typedef, il programma è mal-formata).

Non capisco il motivo per cui in realtà necessità la dichiarazione in avanti, in primo luogo. Perché se hai già il typedef a posto, perché non basta usare quella typedef? E 'solo aswell denota quella classe.

Modifica : Dal tuo commento, sembra che avete bisogno di un colpo di testa di dichiarazione designato in avanti, molto nello stesso vano di <iosfwd>. Quindi, se si modello si chiama Test_Template_Name_Long, questo è un colpo di testa può apparire come

TestFwd.h

template<typename A, typename B> 
class Test_Template_Name_Long;

typedef Test_Template_Name_Long<int, bool> Test1;

Poi si può solo utilizzare tale intestazione, invece di fare class Test1, che il compilatore non ha alcun indizio su ciò che è (e penserà che è una nuova classe, indipendente da qualsiasi modello e typedef).

Altri suggerimenti

typedef Test Test1;
class Test1;

fallisce perché la dichiarazione typedef funge da dichiarazione per il tipo di Test1.

In sostanza, quando il compilatore vede il typedef, ricorda che Test1 è sinonimo di test. Poi quando vede class Test1;, si pensa che ci sia un nuovo tipo che si dichiara. Ma non può trattare che come una dichiarazione perché il nome Test1 è già in uso da parte del typedef.

Se si desidera utilizzare una dichiarazione in avanti per Test1, per esempio, bisogna mettere il typedef in ogni file utilizzando tale typedef come una dichiarazione anticipata. Pertanto, invece di class Test1;, faresti:

class Test;
typedef Test Test1;

Un caso più in cui si verifica tale situazione è questa:

// File: network_fwd.hpp
#ifndef __NETWORK_FWD_HPP__
#define __NETWORK_FWD_HPP__
class Network;
typedef Network GarnetNetwork;
#endif // __NETWORK_FWD_HPP__

// File: network.hpp
#include "network_fwd.hpp"

class GarnetIntLink : public BasicLink
{
  public:

    friend class GarnetNetwork;

};

ho dovuto farlo perché c'era in realtà una classe chiamata GarnetNetwork che ho fuso in classe di rete, e ho voluto diffondere che in tutto il resto del codice utilizzando tale typedef. GCC dà ancora questo messaggio: errore: usando typedef-name ‘GarnetNetwork’ dopo ‘classe’

.

Apprezzo molto il vostro aiuto su questo caso.

NB:. Tra l'altro ho postato questa domanda qui perché ho pensato che è più o meno la stessa cosa e, per non distrarre la comunità

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top