Partage
  • Partager sur Facebook
  • Partager sur Twitter

LNK2019 symbole externe non résolu

Sujet résolu
    15 janvier 2021 à 15:48:44

    Bonjour, je faisais un programme comportant une structure censée simuler des fractions en c++ sur visual studio pour m'entrainer un peu car je suis encore débutant dans ce langage, et tout allait bien jusqu'à ce que je décide de diviser mon programme qui était de A à Z sur un seul fichier dans 3 fichiers : Main.cpp, Functions.hpp et Functions.cpp. Lorsque j'ai fais ça et que j'ai relancé mon programme :

    ErreurLNK2019symbole externe non résolu "struct Fraction __cdecl secu<struct Fraction>(struct Fraction &)" (??$secu@UFraction@@@@YA?AUFraction@@AEAU0@@Z) référencé dans la fonction main(Fichier : Main.obj)

    ErreurLNK11201 externes non résolus(Fichier : Projet.exe)

    J'ai alors réduit mon code juste assez pour savoir d'où vient l'erreur :

    Functions.hpp :

    #include ...

    #ifndef FUNCTIONS_H

    #define FUNCTIONS_H

    struct Fraction

    {

        int num;

        int denum;

    };

    std::ostream& operator<<(std::ostream& os, Fraction const& f);

    std::istream& operator>>(std::istream& is, Fraction& f);

    template <typename T>

    T secu(T& v);

    #endif

    Functions.cpp :

    #include ...

    #include "Functions.hpp"

    std::ostream& operator<<(std::ostream& os, Fraction const& f)

    {

        return os << f.num << '/' << f.denum;

    }

    std::istream& operator>>(std::istream& is, Fraction& f)

    {

        std::string str;

        std::getline(is, str);

        std::string::iterator it{ std::find(str.begin(), str.end(), '/') };

        if (it != str.end())

        {

            *it = ' ';

        }

        std::istringstream iss{ str };

        iss >> f.num >> f.denum;

        return iss;

    }

    template <typename T>

    T secu(T& v)

    {

        try

        {

            T init{ v };

            std::string line;

            std::getline(std::cin, line);

            std::istringstream iss{ line };

            while (!(iss >> v))

            {

                if (std::cin.eof())

                {

                    throw std::runtime_error(u8"le flux a été fermé");

                }

                else

                {

                    std::cout << u8"Ce n'était pas le type demandé !\nRéessaye : ";

                    iss.clear();

                    iss.ignore((std::numeric_limits<std::streamsize>::max)(), '\n');

                    std::getline(std::cin, line);

                    iss = { line };

                }

                v = init;

            }

        }

        catch (std::runtime_error e)

        {

            std::cout << '\n' << e.what() << std::endl;

            exit(0);

        }

        return v;

    }

    Main.cpp :
    #include ...
    #include "Functions.hpp"
    int main()
    {
    SetConsoleOutputCP(CP_UTF8);
    Fraction f{ 1, 2 };
    secu(f);
    std::cout << f;
    return 0;
    }

     A noter que quand je retire la fonction secu(), il n'y a plus d'erreur, l'erreur vient donc de cette fonction sachant que lorsqu'elle était dans Main.cpp, il n'y avait pas d'erreur. Je me demande alors d'où vient l'erreur et comment la résoudre.

    • Partager sur Facebook
    • Partager sur Twitter
      15 janvier 2021 à 16:52:14

      Pensez à utiliser le bouton [</>] pour poster du code.

      C'est une erreur à l'edition de lien, pas à la compilation, ce n'est donc pas directement lié à votre code source.

      Pour des raisons qui devraient être expliquées dans votre de C++, il est nécessaire de laisser l'implémentation des fonctions et classes template dans les .h et non dans les .cpp.

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        15 janvier 2021 à 17:01:13

        Merci beaucoup, ça fonctionne :D
        • Partager sur Facebook
        • Partager sur Twitter

        LNK2019 symbole externe non résolu

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown