Visual Studio C++ & Boost Lib : impossible de trouver la définition de fonction uniquement lorsque BOOST_FOREACH est présent


Crack498

J'ai récemment installé Visual Studio et commencé à travailler un peu avec la bibliothèque SFML et la bibliothèque Boost, mais je suis tombé sur cette erreur étrange (pour moi), lorsque je déclare une fonction vide statique dans le fichier d'en-tête d'une classe statique, Visual Studio me dit "La définition de la fonction pour 'findTextures' est introuvable" si et seulement si le code BOOST_FOREACH est présent dans la fonction. L'un d'entre vous sait pourquoi cela se produit ? Merci beaucoup.

Ce serait le TextureLoader.h :

#include <SFML/Graphics.hpp>
#include <boost/filesystem.hpp>
#include <boost/foreach.hpp>
#include <iostream>

class TextureLoader {
public:
    static const sf::Texture& getTexture(sf::String l_name);
    static void findTextures();

private:
    static std::map<sf::String, sf::Texture> textures;
};

Et voici la classe TextureLoader.cpp :

#include "TextureLoader.h"

// Get texture using name
const sf::Texture& TextureLoader::getTexture(sf::String l_name) {
    return textures.at(l_name);
}

void TextureLoader::findTextures() {
    namespace fs = boost::filesystem;
    fs::path targetDir("/Textures");
    fs::directory_iterator it(targetDir), eod;
    BOOST_FOREACH(fs::path const &p, std::make_pair(it, eod)) {
        if(fs::is_regular_file(p)) {
            std::cout << p.filename();
        }
    }
}

Le résultat:

1>------ Build started: Project: MasterTest, Configuration: Debug Win32 ------
1>TextureLoader.cpp
1>Unknown compiler version - please run the configure tests and report the results
1>TextureLoader.obj : error LNK2001: unresolved external symbol "private: static class std::map<class sf::String,class sf::Texture,struct std::less<class sf::String>,class std::allocator<struct std::pair<class sf::String const ,class sf::Texture> > > TextureLoader::textures" (?textures@TextureLoader@@0V?$map@VString@sf@@VTexture@2@U?$less@VString@sf@@@std@@V?$allocator@U?$pair@$$CBVString@sf@@VTexture@2@@std@@@5@@std@@A)
1>F:\Coding\VSProjects\MasterTest\Debug\MasterTest.exe : fatal error LNK1120: 1 unresolved externals
1>Done building project "MasterTest.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Le journal des erreurs

Jan Hudec

Eh bien, lisez attentivement le nom du symbole manquant. Ça dit:

std::map</*…*/> TextureLoader::textures

Ce n'est pas n'importe quelle fonction. C'est la variable membre statique. Et bien, ça vous manque en effet. Votre .cppfichier doit inclure sa définition, qui doit ressembler à :

std::map<sf::String, sf::Texture> TextureLoader::textures;

Parce que déclarer des variables membres statiques n'est pas suffisant. Il faut aussi les définir.

Articles connexes