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.
Quindi è possibile sovraccaricare la costanza dei parametri? Non lo sapevo. – Bwmat
@Bwmat Sono considerate derivazioni diverse dello stesso tipo, quindi tipi consequenziali diversi e quindi qualificano per la qualifica della firma per sovraccarichi. – WhozCraig