我有一个未解决的外部符号错误,这让我疯狂.简而言之,我有一个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的调试版本.