Oto kod testuSłowo kluczowe "szablon" nie jest potrzebne? [Gcc/dzyń/Comeau bug?]
template <class T> void f()
{
T t;
t.f<T>(0); //compiles even without the "template" keyword, what am I missing?
}
class abc
{
public:
template <typename T>
void f (int){}
};
int main()
{
f<abc>();
}
używam g ++ 4.4.6. Dzięki
P.S: Znacznie zredagowałem moje pytanie. Proszę, nie przejmuj się.
EDIT: Poprosiłem to pytanie do EDG ludzi i to właśnie Mike Herrick miał powiedzieć
Mamy zdiagnozować to jako błąd w trybie --strict jak również dowolny tryb, który umożliwia zależne wyszukiwanie nazwy (np. --dep_name, --parse_templates). Wyszukiwanie nazw zależnych jest wyłączone w trybach emulacji GNU, więc nie wysyłamy tego błędu w takim przypadku.
Przetwarzanie nazwy zależnej wymaga, aby włączone były prototypowe instancje nieklasy (patrz poniżej). Podobnie jak w przypadku prototypowych instancji typu "nonclass", włączenie wyszukiwania zależnej nazwy prawdopodobnie spowoduje błędy kompilacji podczas kompilowania kodu , który nie został napisany z myślą o tej funkcji.
Zależne reguły wyszukiwania nazw wymagają, aby niezależne nazwy były sprawdzane w punkcie użycia w definicji szablonu, i aby w przypadku tego połączenia przeprowadzać niezależne wywołania w celu sprawdzenia przeciążenia . W przypadku wywołań zależnych zestaw nazw jest zestawem widocznym w miejscu użycia w definicji szablonu oraz wszystkich nazw utworzonych widocznych przez wyszukiwanie zależne od argumentu w punkcie tworzenia instancji. Należy pamiętać, że typy wbudowane nie mają przypisanych obszarów nazw, dlatego wywołania z tylko wbudowanymi typami mogą dotyczyć tylko nazw widocznych w definicji szablonu . Ponadto nazwy z zależnych klas bazowych nie są widoczne dla niewykwalifikowanych wyszukiwań.
Poniżej przedstawiono niektóre z najczęstszych problemów napotykanych kodu przy użyciu nazwy zależną odnośnika:
template <class T> struct B {
void f();
};
template <class T> struct A : public B<T> {
X x; // error: X not visible yet (formerly an error in strict mode)
void g() {
f(); // error: B<T>::f not visible
this->f(); // must be written this way
h(1); // error: h(int) not visible using argument-dependent lookup
}
};
struct X {};
void h(int);
A<int> ai;
Jeśli zmienisz nazwę elementu 'f', więc nie będzie on udostępniać nazwy globalnego' f', to nie skompiluje się na GCC bez określenia 'szablonu'. Nie wiem, dlaczego to robi różnicę. – interjay
Gcc stał się mądrzejszy. :) – iammilind