功能拒绝在加速测试功能工作

问题描述:

我无法理解为什么在类的构造函数我可以调用这个函数,但在测试函数调用时,错误出与功能拒绝在加速测试功能工作

E:\Projects\NasuTek-Plugin-Engine\tests\CheckAddonEngine.cpp:64: error: conversion from 'std::auto_ptr<FakeSettableFeaturePlugin>' to 'std::auto_ptr<FakeFeature>' is ambiguous 

C++文件

#include <ObjectEngine.h> 
#include <memory> 

#define BOOST_TEST_MAIN 
#include <boost/test/unit_test.hpp> 

class FakeFeature : public PObject { 
    public: 
     inline virtual const char *returnSomthingCool() { return "Somthing Cool"; } 
}; 

class FakeFeaturePlugin : public FakeFeature { 
    public: 
     inline const char *returnSomthingCool() { return "Somthing Cool From a Plugin Object"; } 
     inline std::string getName() { return "Fake Feature Plugin Object"; } 
}; 

class FakeSettableFeaturePlugin : public FakeFeature { 
    public: 
     inline const char *returnSomthingCool() { return _value; } 
     inline char *setSomthingCool(const char *value) { _value = const_cast<char *>(value); } 
     inline std::string getName() { return "Fake Feature Settable Plugin Object"; } 
    private: 
     char *_value; 
}; 

typedef ObjectEngine<FakeFeature> FakeFeatureEngine; 

class FakeApplication { 
    public: 
     inline FakeApplication(){ 
      _engine = new FakeFeatureEngine(); 

      std::auto_ptr<FakeFeature> pluginToAdd (new FakeFeaturePlugin); 

      _engine->addObject(pluginToAdd); // Essencially what im doing where it errors, both classes inherit FakeFeature 
     } 

     inline ~FakeApplication() { 
      delete _engine; 
     } 

     FakeFeatureEngine *_engine; 
}; 

BOOST_AUTO_TEST_CASE(getengineobject) { 
    FakeApplication *application = new FakeApplication(); 
    FakeFeature &feature = application->_engine->getObject("Fake Feature Plugin Object"); 

    BOOST_CHECK_EQUAL(feature.getName(), "Fake Feature Plugin Object"); 
    BOOST_CHECK_EQUAL(feature.returnSomthingCool(), "Somthing Cool From a Plugin Object"); 

    delete application; 
} 

BOOST_AUTO_TEST_CASE(addobjecttoengine) { 
    FakeApplication *application = new FakeApplication(); 

    std::auto_ptr<FakeSettableFeaturePlugin> plugin (new FakeSettableFeaturePlugin); 
    plugin.get()->setSomthingCool("Bro I Set this to this value ^_^"); 

    application->_engine->addObject(plugin); // This is the line that fails 

    FakeFeature &feature = application->_engine->getObject("Fake Feature Settable Plugin Object"); 

    BOOST_CHECK_EQUAL(feature.getName(), "Fake Feature Settable Plugin Object"); 
    BOOST_CHECK_EQUAL(feature.returnSomthingCool(), "Bro I Set this to this value ^_^"); 

    delete application; 
} 

.h文件中

/** 
    @file ObjectEngine.h 
    @brief Header File with Plugin Engine Templates to make adding a plugin interface to your app easier 
    */ 

#ifndef NASUTEKPLUGINENGINE_H 
#define NASUTEKPLUGINENGINE_H 

#include <boost/ptr_container/ptr_list.hpp> 
#include <boost/type_traits/is_base_of.hpp> 
#include <stdio.h> 
#include <string> 

class PObject { 
    public: 
     inline PObject() {} 
     virtual std::string getName() = 0; 
}; 

template<typename TObjectType> 
class ObjectEngine { 
    public: 
     ObjectEngine() {} 
     ~ObjectEngine() { 
      _objects.clear(); 
     } 
     void addObject(std::auto_ptr<TObjectType> obj) { 
      if(boost::is_base_of<PObject, TObjectType>::value) { 
       _objects.push_back(obj.release()); 
      } 
     } 
     TObjectType &getObject(std::string objectName) { 
      typename boost::ptr_list<TObjectType>::iterator i; 
      for(i = _objects.begin(); i != _objects.end(); i++) { 
       if((*i).getName() == objectName) { 
        return *i; 
       } 
      } 
      throw "Object does not exist."; 
     } 
     bool objectExist(std::string objectName) { 
      typename boost::ptr_list<TObjectType *>::iterator i; 
      for(i = _objects.begin(); i != _objects.end(); i++) { 
       if((*i).getName() == objectName) { 
        return true; 
       } 
      } 
      return false; 
     } 
    private: 
     boost::ptr_list<TObjectType> _objects; 
}; 

#endif // NASUTEKPLUGINENGINE_H 

我想要做的就是创建为我的项目插件引擎,同时使它可以重用,C++文件确保它的工作正确。

+0

您的意思是''std :: auto_ptr plugin(new FakeSettableFeaturePlugin);'','addobjecttoengine'与'FakeApplication'相同吗? – Johnsyweb 2011-12-31 04:41:37

+0

它不是相同的类perse,但是来自失败的行的'FakeSettableFeaturePlugin'和来自工作的行的'FakeFeaturePlugin'都全部继承'FakeFeature'。而add函数需要'std :: auto_ptr '。 – DrHouse 2011-12-31 05:01:32

+1

OOOOOOOOH我现在看到我的错误,Johnsyweb是正确的,这是FakeFeature,我忽略了这一点。谢谢。 – DrHouse 2011-12-31 07:49:56

这看起来并不像与升压试验,本身一个问题,但它看起来像addobjecttoengine行...

std::auto_ptr<FakeSettableFeaturePlugin> plugin (new FakeSettableFeaturePlugin); 

...应该是...

std::auto_ptr<FakeFeature> plugin(new FakeSettableFeaturePlugin); 

...与FakeApplication的构造函数相同。然后在CheckAddonEngine.cpp:64没有转换执行。