J'ai une classe avec deux constructeurs, un qui ne prend aucun argument et un qui prend un argument.
La création d'objets à l'aide du constructeur qui prend un argument fonctionne comme prévu. Cependant, si je crée des objets à l'aide du constructeur qui ne prend aucun argument, j'obtiens une erreur.
Par exemple, si je compile ce code (en utilisant 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;
}
... j'obtiens l'erreur suivante:
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 ()()’
Pourquoi est-ce et comment puis-je le faire fonctionner?
Réponses:
changer pour
Vous obtenez l'erreur parce que le compilateur pense
à partir de la déclaration de fonction avec le nom 'foo2' et le type de retour 'Foo'.
Mais dans ce cas, si nous passons à
Foo foo2
, le compilateur peut afficher l'erreur" call of overloaded ‘Foo()’ is ambiguous"
.la source
Juste pour info..
Ce n'est en fait pas une solution à votre code, mais j'ai eu le même message d'erreur lors d'un accès incorrect à la méthode d'une instance de classe pointée par
myPointerToClass
, par exempleoù
serait évidemment correct.
la source
En ajoutant à la base de connaissances, j'ai eu la même erreur pour
Même si l'IDE m'a donné les bons membres pour class_iter. De toute évidence, le problème est qu'il
"anything"::iterator
n'y a pas de membre appelé,num
donc je dois le déréférencer. Ce qui ne fonctionne pas comme ça:...Apparemment. Je l'ai finalement résolu avec ceci:
J'espère que cela aide quelqu'un qui traverse cette question comme je l'ai fait.
la source
La parenthèse n'est pas requise pour instancier un objet classe lorsque vous n'avez pas l'intention d'utiliser un constructeur paramétré.
Utilisez simplement Foo foo2;
Ça va marcher.
la source
J'avais une erreur similaire, il semble que le compilateur comprenne mal l'appel au constructeur sans arguments. Je l'ai fait fonctionner en supprimant les parenthèses de la déclaration de variable, dans votre code quelque chose comme ceci:
la source
[stmt.ambig/1]
et[dcl.ambig.res/1]
, la norme stipule explicitement qu'en cas d'ambiguïté, tout ce qui peut être interprété comme une déclaration EST une déclaration, pour résoudre cette ambiguïté.)Je suis tombé sur un cas où j'ai reçu ce message d'erreur et
et essayait essentiellement de passer un objet Bar temporaire au constructeur Foo. Il s'avère que le compilateur traduisait cela en
c'est-à-dire une déclaration de fonction dont le nom est foo qui renvoie un Foo qui accepte un argument - un pointeur de fonction renvoyant une barre avec 0 arguments. Lors du passage dans des temporaires comme celui-ci, mieux vaut utiliser
Bar{}
plutôt que d'Bar()
éliminer l'ambiguïté.la source
Si vous voulez déclarer une nouvelle substance sans paramètre (sachant que l'objet a des paramètres par défaut) n'écrivez pas
mais
la source
Certes, un cas d'angle pour cette erreur, mais je l'ai reçu dans une situation différente, lorsque j'essayais de surcharger l'affectation
operator=
. C'était un peu crypté IMO (de g ++ 8.1.1).J'ai reçu 2 erreurs "identiques"
(L'erreur équivalent
clang
est la suivante :error: member reference base type 'float' is not a structure or union
)pour les lignes
data.i = data;
etdata.f = data;
. Il s'avère que le compilateur confondait le nom de variable locale «données» et ma variable membredata
. Quand j'ai changé celavoid operator=(T newData)
etdata.i = newData;
,data.f = newData;
l'erreur a disparu.la source
@MykolaGolubyev a déjà donné de merveilleuses explications. Je cherchais une solution pour faire quelque chose comme ça,
MyClass obj ( MyAnotherClass() )
mais le compilateur l'interprétait comme une déclaration de fonction.C ++ 11 a braced-init-list . En utilisant cela, nous pouvons faire quelque chose comme ça
Cependant, ceci:
jette une erreur de compilation car il considère
t
comme de typeTemp(String (*)())
.la source