我想要存档的是一些简单的方法来使一些变量持久化.为此,我写了一个PeristenceProvider类,它包含boost属性树功能,用于在xml/ini文件中存储数据.
目前我需要做这样的事情:
ClassA::ClassA()
{
m_valueI = PersistenceProvider::getInstance.get<int>("valueI");
}
ClassA::~ClassA()
{
PeristenceProvider::getInstance.set<int>("valueI", m_valueI);
}
Run Code Online (Sandbox Code Playgroud)
但是有机会以这样的方式隐藏它:
class ClassA
{
Persist<int, "valueI"> m_ValueI;
}
Run Code Online (Sandbox Code Playgroud) 我有以下问题:
template<class T>
void set(std::string path, const T data)
{
stringstream ss;
ss << data << std::endl;
write(path, ss.str();
}
template<class T>
void set(std::string path, const T data)
{
std::stringstream ss;
for(typename T::const_iterator it = data.begin(); it < data.end(); ++it)
{
ss << *it;
if(it < data.end() -1 )
ss << ", ";
}
ss << std::endl;
write(path, ss.str());
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
error: ‘template<class T> void myclass::set(std::string, T)’ cannot be overloaded
error: with ‘template<class T> void myclass::set(std::string, T)’
Run Code Online (Sandbox Code Playgroud)
有没有办法区分容器类型和模板中的其他类型?
我有一个abstact基类,在它的构造函数中调用一个虚方法.在传递一个shared_ptr基类之后,找不到该方法的实现.
class a
{
public:
a() { fill(); }
protected:
virtual void fill() = 0;
}
class b : public a
{
public:
b() : a();
protected:
virtual void fill() { // do something }
}
....
shared_ptr<a> sptr = shared_ptr<a> ( new b()): // error happens here on runtime
Run Code Online (Sandbox Code Playgroud)
执行此操作时,我得到一个SIGABRT,因为它试图执行 virtual void fill() = 0;
我使用Eclipse和CDT来构建C++代码.加载我的工作区后,我收到以下消息:
An internal error occurred during: "Setting up indexer".
Run Code Online (Sandbox Code Playgroud)
这是日志:
eclipse.buildId=I20110613-1736
java.version=1.6.0_24
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=linux, ARCH=x86, WS=gtk, NL=en_US
Command-line arguments: -os linux -ws gtk -arch x86
!ENTRY org.eclipse.core.jobs 4 2 2012-10-30 16:46:09.940
!MESSAGE An internal error occurred during: "Setting up indexer".
!STACK 0
java.lang.ArrayIndexOutOfBoundsException: 18
at org.eclipse.cdt.internal.core.pdom.db.Database.getChunk(Database.java:274)
at org.eclipse.cdt.internal.core.pdom.db.Database.getRecPtr(Database.java:477)
at org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage.getLinkageID(PDOMLinkage.java:119)
at org.eclipse.cdt.internal.core.pdom.PDOM.readLinkages(PDOM.java:351)
at org.eclipse.cdt.internal.core.pdom.PDOM.loadDatabase(PDOM.java:334)
at org.eclipse.cdt.internal.core.pdom.PDOM.<init>(PDOM.java:310)
at org.eclipse.cdt.internal.core.pdom.WritablePDOM.<init>(WritablePDOM.java:57)
at org.eclipse.cdt.internal.core.pdom.WritablePDOM.<init>(WritablePDOM.java:52)
at org.eclipse.cdt.internal.core.pdom.PDOMManager.getOrCreatePDOM(PDOMManager.java:370)
at org.eclipse.cdt.internal.core.pdom.PDOMManager.createIndexer(PDOMManager.java:554)
at org.eclipse.cdt.internal.core.pdom.PDOMSetupJob.run(PDOMSetupJob.java:58)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
Run Code Online (Sandbox Code Playgroud)
我该如何修复/重置?
我有两个类U和T的shared_ptrs,其中T是U的基础.
这是没有问题的,从做一个隐式转换shared_ptr<U>到shared_ptr<T>.但也有可能做到转换shared_ptr<T>为shared_ptr<U>?
我尝试了这种消化的解决方案:
class T {
public:
virtual ~T() {}
protected:
void fillData() = 0;
};
class Timpl : public T
{
public:
virtual ~Timpl() {}
protected:
virtual void fillData() = 0;
};
class U : public Timpl {
public:
virtual ~U() {}
protected:
virtual void fillData() {...} // fill
};
typedef shared_ptr<T> TPtr
typedef shared_ptr<U> UPtr
TPtr tp = std::make_shared<U>();
UPtr up = std::static_pointer_cast<U>(tp); //<-- error here :
Run Code Online (Sandbox Code Playgroud)
错误:没有匹配函数来调用'static_pointer_cast(TPtr)'
注意:模板std :: …