Cześć :)

template<typename T>
std::ostream& operator<<(std::ostream& os, const typename K<T>::CountedNode& l){
return os;
}

int main() {
K<int>::CountedNode c;
std::cout << c;

return 0;

}

Powyższy kod powoduje błąd:
no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘K<int>::CountedNode’

Natomiast, jeżeli dodam definicję:

std::ostream& operator<<(std::ostream& os, const typename K<int>::CountedNode& l){
return os;
}
Kod się kompiluje, no więc widać, że jest jakis problem z dedukcją. Dlaczego?