połączenie funkcji szablonowej z klasą szablonową

0

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?

0
func<int>(b);
0

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;
}
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

0

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. :-(

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0