ah
#include "logic.h"
...
class A
{
friend ostream& operator<<(ostream&, A&);
...
};
logic.cpp
#include "a.h"
...
ostream& logic::operator<<(ostream& os, A& a)
{
...
}
...
Quando eu compilo, ele diz:
std :: ostream & logic :: operator << (std :: ostream &, A &) 'deve receber exatamente um argumento.
Qual é o problema?
c++
operator-overloading
iostream
Como ... como
fonte
fonte
Uma função de amigo não é uma função de membro, então o problema é que você declara
operator<<
como amigo deA
:em seguida, tente defini-lo como uma função membro da classe
logic
Você está confuso sobre se
logic
é uma classe ou um namespace?O erro é porque você tentou definir um membro
operator<<
levando dois argumentos, o que significa que leva três argumentos, incluindo othis
parâmetro implícito . O operador só pode aceitar dois argumentos, de modo que, quando você escreve,a << b
os dois argumentos sãoa
eb
.Você deseja definir
ostream& operator<<(ostream&, const A&)
como uma função não- membro, definitivamente não como um membro de,logic
uma vez que não tem nada a ver com aquela classe!fonte
Corri para esse problema com classes modeladas. Aqui está uma solução mais geral que tive de usar:
Agora: * Minha função toString () não pode ser embutida se for colocada em cpp. * Você está preso com algum código no cabeçalho, não consegui me livrar dele. * O operador chamará o método toString (), não é sequencial.
O corpo do operador << pode ser declarado na cláusula friend ou fora da classe. Ambas as opções são feias. :(
Talvez eu esteja entendendo mal ou faltando alguma coisa, mas apenas declarar o modelo de operador não vincula no gcc.
Isso também funciona:
Eu acho que você também pode evitar os problemas de modelagem que forçam declarações nos cabeçalhos, se você usar uma classe pai que não seja modelada para implementar o operador <<, e usar um método toString () virtual.
fonte
Se você definir
operator<<
como uma função de membro, ela terá uma sintaxe decomposta diferente do que se você usasse um não membrooperator<<
. Um não membrooperator<<
é um operador binário, onde um membrooperator<<
é um operador unário.Então .... como você realmente os chama? Os operadores são estranhos em alguns aspectos, vou desafiá-lo a escrever a
operator<<(...)
sintaxe em sua cabeça para fazer as coisas fazerem sentido.Ou você pode tentar chamar o operador binário não membro:
Você não tem obrigação de fazer esses operadores se comportarem intuitivamente ao transformá-los em funções de membro, você pode definir
operator<<(int)
para o deslocamento à esquerda alguma variável de membro se quiser, entenda que as pessoas podem ser um pouco pegas de surpresa, não importa quantos comentários você possa escrever.Quase por último, pode haver momentos em que ambas as decomposições para uma chamada de operador sejam válidas, você pode ter problemas aqui e nós adiaremos essa conversa.
Por último, observe como pode ser estranho escrever um operador de membro unário que supostamente se pareça com um operador binário (já que você pode tornar os operadores de membro virtuais ..... também tentando não devolver e percorrer este caminho .... )
Esta sintaxe irritará muitos programadores agora ....
Observe como o
cout
é o segundo argumento na cadeia aqui .... estranho, certo?fonte