Erreur étrange "une référence à une fonction membre non statique doit être appelée"

york.beta

Pourquoi est-ce que j'obtiens l'erreur "la référence à la fonction membre non statique doit être appelée":

<source>:35:19: error: reference to non-static member function must be called

    list_.front().Set<Flags::First>(true);

    ~~~~~~~~~~~~~~^~~

<source>:40:10: note: in instantiation of member function 'List<int>::Set' requested here

    list.Set();

         ^

<source>:13:8: note: possible target for call

  void Set(bool value) {

       ^

1 error generated.

Compiler returned: 1

quand j'essaye de compiler ce code avec clang 7.0.0 ?

#include <iostream>
#include <list>
using namespace std;

enum class Flags : uint8_t {
    First  = 1,
    Second = 2
};

class Header {
public:
  template <Flags flag>
  void Set(bool value) {
       flags_ = static_cast<Flags>(
           value
           ? (static_cast<uint8_t>(flags_) | static_cast<uint8_t>(flag))
           : (static_cast<uint8_t>(flags_) & (~static_cast<uint8_t>(flag))));
  }

private:
  Flags flags_{};
};

template <class T>
class List {
public:
    void Set();

private:
    std::list<Header> list_;
};

template <class T>
void List<T>::Set() {
    list_.front().Set<Flags::First>(true);
}

int main() {
    List<int> list;
    list.Set();
    return 0;
}

Voir ici : https://godbolt.org/z/KXttBb

Inutile

Nous pouvons expliquer à la fois comment diagnostiquer cela et comment et pourquoi le correctif fonctionne.

<source>:35:19: error: reference to non-static member function must be called

OK, donc clang pense que quelque chose nomme une fonction membre non statique et que l'expression dans laquelle vous l'utilisez n'est pas un appel de fonction :

list_.front().Set<Flags::First>(true);

~~~~~~~~~~~~~~^~~

Il nous dit assez explicitement qu'il reconnaît Setcomme une fonction membre non statique, mais il pense que ce Set<Flags::First>(true)n'est pas un appel de fonction.

Évidemment, c'est exactement la bonne syntaxe pour appeler un modèle de fonction, donc le problème est que clang n'est pas traité Setcomme un modèle de fonction.


À ce stade, lisez définitivement la question liée dans les commentaires ci-dessus et la réponse acceptée .

...


Bon, maintenant que vous avez lu cela, il est évident qu'il Sets'agit d'un nom de fonction dépendant, et nous pouvons résoudre le problème en ajoutant templatecomme ceci :

list_.front().template Set<Flags::First>(true);

mais cela laisse encore ouverte la question de savoir pourquoi le nom est dépendant. Je veux dire, en lisant le code, nous savons qu'il list_.front()doit avoir le type Header&, n'est-ce pas ?

Essayons donc de l'écrire explicitement :

Header &front = list_.front();
front.Set<Flags::First>(true);

et nous voyons (toujours avec clang 8 ou 9) que cela fonctionne maintenant sans le supplément template. Si vous écrivez auto &front, le problème revient.

FWIW, cela apparaît dans clang 8 et 9, mais disparaît dans clang 10, et ne semble jamais se produire dans GCC. Donc, c'est peut-être un bug, mais au moins vous savez maintenant comment le diagnostiquer et comment le contourner.

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

TOP liste

  1. 1

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  2. 2

    Enregistrer le chemin de l'image de la galerie vers la base de données de la salle et l'afficher dans la liste des recycleurs

  3. 3

    Microsoft.WebApplication.targets

  4. 4

    knn classification 10 plis de l'outil et du tri

  5. 5

    Créer un système Buzzer à l'aide de python

  6. 6

    Quelle est la relation entre le modèle et le tableau ? C'est compliqué

  7. 7

    AutoMapper.Collection.EFCore - Erreur générée lors de la configuration

  8. 8

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  9. 9

    Fonction de puissance en Java

  10. 10

    Je continue à obtenir l'objet 'WSGIRequest' n'a pas d'attribut 'Get' sur django

  11. 11

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  12. 12

    Comment remplir les valeurs manquantes avec plusieurs colonnes dans R

  13. 13

    Comment puis-je ajouter un UIView sous mon contrôleur de barre d'onglets par programme?

  14. 14

    Comment créer un bot à compte à rebours dans Discord en utilisant Python

  15. 15

    Sélectionnez le bouton radio sur la saisie de texte

  16. 16

    Comment rechercher des éléments dans une ArrayList? - Java

  17. 17

    opérations en virgule flottante dans go

  18. 18

    Yat-il un référentiel maven application Java à démarrer rapidement 11

  19. 19

    Placez le modeBar en haut au centre à l'aide de plotly.js

  20. 20

    Comment définir la couleur de l'intersection dans un diagramme de Venn?

  21. 21

    Récupérer plusieurs dépôts git dans le même espace de travail Jenkins

chaudétiquette

Archive