c – 未解决的外部问题

我有一个解决的外部符号错误,这让我疯狂.简而言之,我有一个SDL_Surfaces包装类(‘DgSurface’)和一个加载和存储DgSurfaces(‘DgSurfaceList’)的类.尝试在我的项目中包含DgSurfaceList文件时出现链接问题.这是我的课程:

文件“DgSurface.h”包含DgSurface类声明:

#ifndef DGSURFACE_H
    #define DGSURFACE_H

    #include "SDL.h"
    #include <string>

    class DgSurface
    {
    public:

        //Constructor/destructor
        DgSurface(std::string N,SDL_Surface* I): image(I),name(N) {}
        DgSurface() {name = ""; image = NULL;}
        ~DgSurface();

        //copy operations
        DgSurface(const DgSurface&);
        DgSurface& operator= (const DgSurface&);

        //Data members
        std::string name;       //The name of the image
        SDL_Surface* image;     //The image
    };

    #endif

cpp文件“DgSurface.cpp”包含DgSurface定义:

#include "DgSurface.h"
#include "SDL.h"

//--------------------------------------------------------------------------------
//        Constructor
//--------------------------------------------------------------------------------
DgSurface::DgSurface(const DgSurface& other)
{
    //copy name
    name = other.name;

    //Create new SDL_Surface 
    image = SDL_ConvertSurface(other.image,other.image->format,0);
}


//--------------------------------------------------------------------------------
//        Destructor
//--------------------------------------------------------------------------------
DgSurface::~DgSurface()
{
    SDL_FreeSurface(image);
}


//--------------------------------------------------------------------------------
//        Assignment operator
//--------------------------------------------------------------------------------
DgSurface& DgSurface::operator= (const DgSurface& other)
{
    // if same object
    if ( this == &other )
        return *this;

    //copy name
    name = other.name;

    //Create new SDL_Surface 
    image = SDL_ConvertSurface(other.image,0);

    return *this;
}

这个类似乎工作正常,并按预期执行(但是,一如既往,我愿意接受反馈:).

“DgSurfaceList.h”包含DgSurfaceList类声明:

#ifndef DGSURFACELIST_H
#define DGSURFACELIST_H

#include "SDL.h"
#include <list>
#include <string>
#include "DgSurface.h"


class DgSurfaceList
{
    public:
        //Constructors/destructor
        DgSurfaceList() {}
        ~DgSurfaceList() {}

        //Functions
        bool AddImage(std::string location,std::string name);

        //Return Functions
        SDL_Surface* Getimage(std::string S) const;

    private:
        //Data members
        std::list<DgSurface> imlist;    //The list of DgSurfaces

        //Functions
        SDL_Surface* LoadImage( std::string filename );
};


#endif

最后“DgSurfaceList.cpp”包含DgSurfaceList定义:

#include "SDL.h"
#include "SDL_image.h"
#include <list>
#include <string>
#include "DgSurface.h"
#include "DgSurfaceList.h"


//--------------------------------------------------------------------------------
//      Load an image from file
//--------------------------------------------------------------------------------
SDL_Surface* DgSurfaceList::LoadImage( std::string filename )
{
    //Loads an image from file,returns SDL_surface*
    ...

}   //End:DgSurfaceList::LoadImage()


//--------------------------------------------------------------------------------
//      Add a DgSurface to the list
//--------------------------------------------------------------------------------
bool DgSurfaceList::AddImage(std::string location,std::string name) 
{
    //Load the image
    DgSurface temp(name,LoadImage(location));

    //If there was an error in loading the image
    if( temp.image == NULL )
        return false;

    //If everything loaded fine,place a copy into imlist
    imlist.push_back(temp);

    return true;

}   //End: DgSurfaceList::AddImage();


//--------------------------------------------------------------------------------
//      Searches imlist for an image,returns a pointer to a SDL_Surface
//--------------------------------------------------------------------------------
SDL_Surface* DgSurfaceList::Getimage(std::string S) const
{
    std::list<DgSurface>::const_iterator i;

    //Search imlist for DgSurface of the same name
    for (i = imlist.begin(); i != imlist.end(); i++)
    {
        if (S.compare((*i).name) == 0)
            return (*i).image;
    }

    //Return Null if name not found
    return NULL;

}   //End:DgSurfaceList::Getimage()

现在,如果我在cpp文件中注释掉DgSurfaceList :: Getimage()定义,DgSurfaceList似乎工作正常并正确存储图像.更具体地说,仅当我在上述函数中包含for循环时才会出现链接错误.会是什么呢?

其他信息:

错误

unresolved external symbol __imp___CrtDbgReportW referenced in function "public: class 
DgSurface const & __thiscall std::_List_const_iterator<class std::_List_val<class 
DgSurface,class std::allocator<class DgSurface> > >::operator*(void)const "

编码环境:
Visual C express 2010

解决方法

CrtDbgReport仅在C运行时库的调试版本中定义.因此,您可能正在编译调试模式,但链接到库的发行版本.另一种可能性是您在发布模式下进行编译,但是您定义的某个宏导致编译std :: list的调试版本.

相关文章

对象的传值与返回说起函数,就不免要谈谈函数的参数和返回值...
从实现装饰者模式中思考C++指针和引用的选择最近在看...
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自...
那些陌生的C++关键字学过程序语言的人相信对关键字并...
命令行下的树形打印最近在处理代码分析问题时,需要将代码的...
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特...