Eu tenho uma classe com dois construtores, um que não aceita argumentos e outro que aceita um argumento.
Criar objetos usando o construtor que usa um argumento funciona como esperado. No entanto, se eu criar objetos usando o construtor que não aceita argumentos, recebo um erro.
Por exemplo, se eu compilar esse código (usando g ++ 4.0.1) ...
class Foo
{
public:
Foo() {};
Foo(int a) {};
void bar() {};
};
int main()
{
// this works...
Foo foo1(1);
foo1.bar();
// this does not...
Foo foo2();
foo2.bar();
return 0;
}
... Estou tendo o erro a seguir:
nonclass.cpp: In function ‘int main(int, const char**)’:
nonclass.cpp:17: error: request for member ‘bar’ in ‘foo2’, which is of non-class type ‘Foo ()()’
Por que isso e como faço para funcionar?
Respostas:
mudar para
Você recebe o erro porque o compilador pensa em
a partir da declaração da função com o nome 'foo2' e o tipo de retorno 'Foo'.
Mas nesse caso, se mudarmos para
Foo foo2
, o compilador pode mostrar o erro" call of overloaded ‘Foo()’ is ambiguous"
.fonte
Apenas para o registro ..
Na verdade, não é uma solução para o seu código, mas recebi a mesma mensagem de erro ao acessar incorretamente o método de uma instância de classe apontada por
myPointerToClass
, por exemploOnde
obviamente estaria correto.
fonte
Adicionando à base de conhecimento, recebi o mesmo erro para
Mesmo que o IDE tenha me dado os membros corretos para class_iter. Obviamente, o problema é que
"anything"::iterator
não há um membro chamado,num
então eu preciso desreferê-lo. O que não funciona assim:...pelo visto. Eu finalmente resolvi isso com isso:
Espero que isso ajude alguém que se depara com essa questão da maneira que eu fiz.
fonte
Parênteses não são necessários para instanciar um objeto de classe quando você não pretende usar um construtor parametrizado.
Basta usar Foo foo2;
Vai funcionar.
fonte
Eu estava tendo um erro semelhante, parece que o compilador não entende a chamada para o construtor sem argumentos. Eu fiz funcionar removendo os parênteses da declaração da variável, no seu código, algo como isto:
fonte
[stmt.ambig/1]
e[dcl.ambig.res/1]
, o padrão declara explicitamente que, em caso de ambiguidade, qualquer coisa que possa ser interpretada como uma declaração É uma declaração, para resolver essa ambiguidade.)Encontrei um caso em que recebi a mensagem de erro e tive
e estava basicamente tentando passar um objeto Bar temporário para o construtor Foo. Acontece que o compilador estava traduzindo isso para
isto é, uma declaração de função cujo nome é foo que retorna um Foo que recebe um argumento - um ponteiro de função retornando uma barra com 0 argumentos. Ao passar em temporários como este, é melhor usar em
Bar{}
vez deBar()
eliminar a ambiguidade.fonte
Se você deseja declarar uma nova substância sem parâmetro (sabendo que o objeto tem parâmetros padrão), não escreva
mas
fonte
Certamente, este é um dos principais argumentos para esse erro, mas eu o recebi em uma situação diferente ao tentar sobrecarregar a tarefa
operator=
. Era um IMO um pouco enigmático (de g ++ 8.1.1).Eu recebi 2 erros "idênticos"
(O erro equivalente para
clang
éerror: member reference base type 'float' is not a structure or union
:)para as linhas
data.i = data;
edata.f = data;
. Acontece que o compilador estava confundindo o nome da variável local 'data' e minha variável de membrodata
. Quando eu mudei issovoid operator=(T newData)
edata.i = newData;
,data.f = newData;
, o erro foi embora.fonte
@MykolaGolubyev já deu uma explicação maravilhosa. Eu estava procurando uma solução para fazer algo assim
MyClass obj ( MyAnotherClass() )
mas o compilador a interpretou como uma declaração de função.O C ++ 11 possui uma lista-init-braced . Usando isso, podemos fazer algo parecido com isto
No entanto, isto:
lança erro de compilação, pois considera
t
como do tipoTemp(String (*)())
.fonte