2012-11-09 16 views
5

Ho una domanda su una situazione che ho appena incontrato al lavoro.Chiarimento sulla ricerca del nome in C++

impostazione: in stringStuff.h

namespace n1 
{ 
namespace n2 
{ 
    typedef std::string myString; 
} 
} 

namespace n1 
{ 
namespace n2 
{ 
    void LTrim(myString& io_string); 
    void RTrim(myString& io_string); 

    inline void Trim(myString& io_string) 
    { 
     LTrim(io_string); 
     RTrim(io_string); 
    } 
} 
} 

in impl.cpp

#include "stringStuff.h" // This actually gets included via other include files 
#include "globalInclude.h" // contains 'using namespace n1::n2;'. Yes, I know this isn't best practice 

inline static myString Trim(const myString& in_string) 
{ 
    // impl 
} 

static void impl(const myString& in_string, myString& out_string) 
{ 
    size_t N = 10; // just some computed value. 
    out_string = Trim(in_string.substr(1, N)); // This is the line with the error 
} 

ora, devo ammettere che non capisco ++ regole di risoluzione dei nomi C altrettanto bene come avrei dovuto, ma quando guardo questo, sembra che la chiamata a Trim sia ambigua.

La cosa sorprendente è che si compila bene su Linux utilizzando GCC, chiamando la funzione definita in impl.cpp. Quando compilo su HP-UX usando il suo compilatore nativo, sembra risolvere la chiamata come quella definita in stringStuff.h e si lamenta della conversione di un riferimento temporaneo in un riferimento non const (che è sorprendentemente un avvertimento, non un errore) e su come provare ad assegnare void a myString.

Cosa dovrebbe succedere secondo lo standard C++ e quale compilatore (se presente) sta ottenendo il risultato giusto?

BTW, l'ho risolto nel mio caso con il prefisso della chiamata da tagliare con:, anche se non è proprio l'ideale.

risposta

2

Il trucco è che uno prende un riferimento const e l'altro un riferimento non const, quindi sono due funzioni diverse, non la stessa funzione la cui risoluzione potrebbe essere ambigua. Quindi si riduce a quale sia il tipo di parametro nella chiamata. Poiché substr restituisce un valore, può solo associarsi al riferimento const. Quindi dovrebbe chiamare ::Trim senza un avviso. Direi che il compilatore HP-UX è sbagliato.

+0

Quindi è possibile sovraccaricare la costanza dei parametri? Non lo sapevo. – Bwmat

+1

@Bwmat Sono considerate derivazioni diverse dello stesso tipo, quindi tipi consequenziali diversi e quindi qualificano per la qualifica della firma per sovraccarichi. – WhozCraig