Вот натолкнулся на такую проблему с использованием субжа. Есть два модуля
module.cpp
#include "module.h"
#include <exception>
#include <iostream>
#include <boost/bind.hpp>
Module::worldFactory_t Module::worldFactory_;
bool Module::init()
{
getWorld();
return true;
}
int main()
{
try {
Module::create()->init();
}
catch (std::exception &ex) {
std::cout << ex.what() << std::endl;
}
std::cout << "done." << std::endl;
return 0;
}
module.h
#ifndef MODULE_H
#define MODULE_H
#include <boost/function.hpp>
#include <boost/utility.hpp>
#include <iostream>
class World;
class Module
{
public:
static bool registerWorld(World *(*createFn)())
{
std::cout << "World is registered." << std::endl;
worldFactory_ = createFn;
return true;
}
World *getWorld()
{
return worldFactory_();
}
static Module *create()
{
static Module obj_;
return &obj_;
}
bool init();
private:
typedef boost::function0<World *> worldFactory_t;
static worldFactory_t worldFactory_;
};
#endif
и
world.cpp
#include "module.h"
#include "world.h"
namespace
{
World *create()
{
static World obj;
return &obj;
}
static bool world_registered =
Module::registerWorld(create);
}
world.h
#ifndef AAA
#define AAA
#include <boost/utility.hpp>
class World : boost::noncopyable
{
};
#endif //AAA
При компиляции с помощю mingw(gcc-3.3.1) и выполнении этой программы стабильно на cout выдаётся
World is registered.
call to empty boost::function
done.
VC7.0 всё компилит и выполняет нормально. Я даже не знаю кто тут прав, вроде код верный, и VC прав, хотя кто его знает.
... << RSDN@Home 1.1.3 beta 1 >>