Eu tenho uma estrutura de modelo Foo
que define uma estrutura interna Bar
.
Agora, gostaria de sobrecarregar o fluxo operator <<
para esta struct interna Bar
, mas o compilador parece ignorar minha implementação de sobrecarga:
erro: nenhuma correspondência para 'operator<<' (os tipos de operando são 'std::ostream' {também conhecido como 'std::basic_ostream<char>'} e 'Foo<3>::Bar')
Meu código é o seguinte:
#include <iostream>
//////////////////////////////////////////////////////////////////////////////////////////
template<int N>
struct Foo
{
struct Bar {};
};
//////////////////////////////////////////////////////////////////////////////////////////
template<int N>
std::ostream& operator<< (std::ostream& os, const typename Foo<N>::Bar& x)
{
return os;
}
//////////////////////////////////////////////////////////////////////////////////////////
int main (int argc, char** argv)
{
Foo<3>::Bar x;
std::cout << x << std::endl;
}
Não consigo ver o erro (talvez óbvio).
Pergunta É possível sobrecarregar um operador de uma estrutura interna que pertence a uma classe template?
Sim como isso:
No seu código, isso
operator<<
não está realmente errado. É simplesmente impossívelN
deduzirFoo<N>::Bar
. Você só pode chamá-lo explicitandoN
:Demonstração ao vivo .
A razão é que
Foo<N>::Bar
é um contexto não deduzido. Consulte O que é um contexto não deduzido? para mais detalhes. Resumindo, a razão pela qual isso não funciona é que não existe uma relação 1:1 entreFoo<N>::Bar
eN
. Considere que você adiciona uma especialização:Agora
Foo<42>::Bar
eFoo<3>::Bar
consulte exatamente o mesmo tipo. Essee isto
teria que deduzir valores diferentes,
N
mas em ambos os exemplosx
é exatamente do mesmo tipo.Você quer dizer algo assim? Com classes de modelo geralmente é mais fácil declarar sobrecargas de amigos dentro do modelo (demonstração aqui: https://onlinegdb.com/NqTLD6_tU )