Mam taki problemik:
template<class T>
struct A {
struct B {
};
};
template<class T>
void func(typename A<T>::B& b)
{
}
int main()
{
A<int>::B b;
func(b);
return 0;
}
Dlaczego powyższy kod jest nieprawidłowy?
Mam taki problemik:
template<class T>
struct A {
struct B {
};
};
template<class T>
void func(typename A<T>::B& b)
{
}
int main()
{
A<int>::B b;
func(b);
return 0;
}
Dlaczego powyższy kod jest nieprawidłowy?
func<int>(b);
No dobra, źle dobrałem przykład.
#include <iostream>
template<class T>
struct A {
struct B {
};
};
template<class T>
std::ostream& operator<<(std::ostream& os, const typename A<T>::B& b)
{
return os;
}
int main()
{
A<int>::B b;
std::cout << b << std::endl;
return 0;
}
To jest taka śmieszna sprawa w C++ z szablonami klas wewnętrznych zależnych tylko od tego samego parametru od którego zależna jest ta klasa wyżej.
http://www.parashift.com/c++-faq-lite/templates.html#faq-35.18
No cóź, musiałbyć wywoływać go tak:
operator<<<int>(std::cout, b);
Co raczej nie ma za dużego sensu. Jak widzisz, jeżeli parametr szablonu jest tak uwikłany w typ argumentu funkcji to kompilator sam go nie odgadnie.
Shalom: typename to już właśnie jest, kompilator nie umie wydedukować typu T
z A<T>::B
. Trzeba by zaglądnąć do standardu. Myślisz, że można to jakoś poprawić? Nic mi nie przychodzi do głowy. :-(