IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[Compilation] erreur sous gcc, pas sur Visual


Sujet :

C++

  1. #1
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut [Compilation] erreur sous gcc, pas sur Visual
    Bonjour à tous,

    Afin d'effectuer un portage sous Linux, j'essaye actuellement de compiler mon projet avec gcc 4.3.2 sous Ubuntu 8.10.
    J'ai une erreur que je ne comprend pas...
    Citation Envoyé par gcc
    /tcp_connection.h:59: erreur: expected primary-expression before ‘,’ token
    Je pense que c'est un problème de typename, mais là j'avoue ne pas trop savoir comment m'en sortir.

    J'ai fourni un exemple complet minimal pour ceux qui voudrait le compiler, i.e. un petit main et le .h correspondant. Il y a un petit //ERREUR ICI pour signaler la ligne qui pose problème !

    tcp_connection.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
     
    #ifndef CONNECTION_H
    #define CONNECTION_H
     
    #include <boost/asio.hpp>
    #include <boost/archive/binary_iarchive.hpp>
    #include <boost/archive/binary_oarchive.hpp>
    #include <boost/archive/text_iarchive.hpp>
    #include <boost/archive/text_oarchive.hpp>
    #include <boost/bind.hpp>
    #include <boost/shared_ptr.hpp>
    #include <boost/tuple/tuple.hpp>
    #include <iomanip>
    #include <string>
    #include <sstream>
    #include <vector>
     
    struct ModeBase
    {
    	enum {
    		TEXT_MODE = 0,
    		BINARY_MODE = 1,
    	};
    };
     
    template<int>
    struct Archive
    {
    	typedef boost::archive::text_iarchive i_archive;
    	typedef boost::archive::text_oarchive o_archive;
    };
     
    template<>
    struct Archive<ModeBase::BINARY_MODE>
    {
    	typedef boost::archive::binary_iarchive i_archive;
    	typedef boost::archive::binary_oarchive o_archive;
    };
     
    template <int Mode = ModeBase::TEXT_MODE >
    class tcp_connection
    {
    public:
    	typedef boost::shared_ptr<tcp_connection<Mode> >	pointer;
    	typedef boost::weak_ptr<tcp_connection<Mode> >		w_pointer;
     
    	static pointer create (boost::asio::io_service& io_service)
    	{
    		return pointer(new tcp_connection<Mode>(io_service));
    	}
     
    	template <typename T, typename Handler>
    	void async_read(T& t, Handler handler)
    	{
    		void (tcp_connection<Mode>::*f)(
    			const boost::system::error_code&,
    			T&, boost::tuple<Handler>)  // ERREUR ICI
    			= &tcp_connection<Mode>::handle_read_header<T, Handler>;
     
    		boost::asio::async_read(m_socket, boost::asio::buffer(m_inbound_header),
    			boost::bind(f,
    			this, boost::asio::placeholders::error, boost::ref(t),
    			boost::make_tuple(handler)));
    	}
     
    	/// Handle a completed read of a message header. The handler is passed using
    	/// a tuple since boost::bind seems to have trouble binding a function object
    	/// created using boost::bind as a parameter.
    	template <typename T, typename Handler>
    	void handle_read_header(const boost::system::error_code& e,
    		T& t, boost::tuple<Handler> handler)
    	{
    		// ...
    	}
     
     
     
    private:
    	/// Constructor.
    	tcp_connection(boost::asio::io_service& io_service)
    		: m_socket(io_service)
    	{
    	}
     
    	/// The underlying socket.
    	boost::asio::ip::tcp::socket m_socket;
     
    	/// The size of a fixed length header.
    	enum { header_length = 8 };
     
    	/// Holds an outbound header.
    	std::string m_outbound_header;
     
    	/// Holds the outbound data.
    	std::string m_outbound_data;
     
    	/// Holds an inbound header.
    	char m_inbound_header[header_length];
     
    	/// Holds the inbound data.
    	std::vector<char> m_inbound_data;
    };
     
     
    #endif
    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include "tcp_connection.h"
     
    int main()
    {
        boost::asio::io_service io_service;
     
        tcp_connection<>::pointer new_connection = tcp_connection<>::create(io_service);
     
        return 0;
    }
    En vous remerciant !

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Petit problème subtil. Ce n'est pas un problème de typename car ce n'est pas sur le type que le compilateur butte. En fait, tu demande l'adresse d'une méthode template ... sans dire au compilateur qu'il s'agit d'une méthode template :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void (tcp_connection<Mode>::*f)(const boost::system::error_code&,T&, boost::tuple<Handler>)  // ERREUR ICI
          = &tcp_connection<Mode>::template handle_read_header<T, Handler>; // et non, l'erreur est ici...
    P.S. J'ai aussi l'erreur error: comma at end of enumerator list ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct ModeBase
    {
    	enum {
    		TEXT_MODE = 0,
    		BINARY_MODE = 1,
    	};
    };

  3. #3
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Pour le ModeBase, c'est un oubli. Merci!

    Par contre, pour l'autre erreur je connaissais pas...
    Un grand à toi !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur de compilation template sous GCC MINGW
    Par sukoi dans le forum Langage
    Réponses: 14
    Dernier message: 14/04/2015, 11h57
  2. Réponses: 8
    Dernier message: 30/08/2011, 16h17
  3. compil release ne marche pas sur autre pc
    Par Fred44210 dans le forum C++/CLI
    Réponses: 0
    Dernier message: 04/03/2010, 11h01
  4. Réponses: 4
    Dernier message: 07/05/2009, 20h29
  5. JS rame sous fireFox pas sur IE7
    Par socket77 dans le forum Général JavaScript
    Réponses: 17
    Dernier message: 20/05/2008, 21h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo