MODIFICA: Questo non è un bug, solo che non so di dependent name lookups in templated base classes (che MSVC "utilmente" risolve senza errori).Si tratta di un bug in GCC?
Ho scritto un'implementazione di funtore un po 'indietro e un semplice wrapper "Event" che lo utilizza. Compila bene in MSVC, ma GCC restituisce un errore su una variabile membro nella classe base, subscribers
, non dichiarata; la modifica di subscribers
a this->subscribers
risolve il problema (!). Sembra che accada solo con il modello di template curiosamente ricorrente e con la specializzazione del modello parziale.
fonte semplificato (scusate per l'utilizzo modello spremere le meningi ...):
#include <vector>
template<typename TEvent>
struct EventBase
{
protected:
std::vector<int> subscribers;
};
template<typename TArg1 = void, typename TArg2 = void>
struct Event : public EventBase<Event<TArg1, TArg2> >
{
void trigger(TArg1 arg1, TArg2 arg2) const
{
// Error on next line
auto it = subscribers.cbegin();
}
};
template<typename TArg1>
struct Event<TArg1, void> : public EventBase<Event<TArg1> >
{
void trigger(TArg1 arg1) const
{
// Using `this` fixes error(?!)
auto it = this->subscribers.cbegin();
}
};
template<>
struct Event<void, void> : public EventBase<Event<> >
{
void trigger() const
{
// No error here even without `this`, for some reason!
auto it = subscribers.cbegin();
}
};
int main()
{
return 0;
}
Perchè sono invocano un comportamento indefinito da qualche parte? La mia sintassi è in qualche modo sbagliata? Questo è davvero un bug in GCC? È forse un bug noto? Qualsiasi intuizione sarebbe apprezzata!
Ulteriori dettagli: compilato utilizzando g++ -std=c++11 main.cpp
. Sto usando GCC versione 4.7.2. Messaggio di errore esatto:
main.cpp: In member function ‘void Event<TArg1, TArg2>::trigger(TArg1, TArg2) const’:
main.cpp:17:15: error: ‘subscribers’ was not declared in this scope
Mi sono imbattuto anche in questo. Come regola generale, se coinvolge i modelli, fidati sempre di gcc su msvc (trovo che gcc sia giusto il 99,9 percento delle volte). –
@JesseGood Esiste anche una duplice domanda [SO] (http://stackoverflow.com/q/11405/819272) da un altro rifugiato MSVC. Apparentemente, gcc lo ha risolto da qualche parte nella versione 3.4, rompendo alcuni vecchi codici nel processo. Ma hey, chi ha detto che i venditori hanno bisogno di compatibilità con gli errori come punto vendita? – TemplateRex