C++ Poco::AutoPtr上的常量指针
使用AutoPtr尝试工作常量指针:C++ Poco::AutoPtr上的常量指针,c++,poco-libraries,C++,Poco Libraries,使用AutoPtr尝试工作常量指针: void LiveTimeConfig::setup(const AbstractConfiguration& cfg){ GetLogger().information("LiveTimeConfig::setup(): init data"); Poco::AutoPtr<const AbstractConfiguration> view = cfg.createView("live_time");
void LiveTimeConfig::setup(const AbstractConfiguration& cfg){
GetLogger().information("LiveTimeConfig::setup(): init data");
Poco::AutoPtr<const AbstractConfiguration> view =
cfg.createView("live_time");
try {
readExist(view, Field::Token, _token);
readExist(view, Field::Solt, _solt);
} catch (Poco::SyntaxException& ) {
GetLogger().error("LiveTimeConfig::setup(): bad values");
throw Poco::RuntimeException("LiveTimeConfig::setup(): invalid format");
}
}
void LiveTimeConfig::setup(const AbstractConfiguration&cfg){
GetLogger().information(“LiveTimeConfig::setup():init data”);
Poco::自动传输视图=
cfg.createView(“实时”);
试一试{
readExist(视图,字段::令牌,_令牌);
readExist(视图,字段::Solt,_Solt);
}catch(Poco::SyntaxException&){
GetLogger()错误(“LiveTimeConfig::setup():错误值”);
抛出Poco::RuntimeException(“LiveTimeConfig::setup():无效格式”);
}
}
但我在比较运算符上有错误
。/../../build/pc/include/Poco/AutoPtr.h:在“类Poco::AutoPtr”的实例化中:src/LiveTimeConfig.cpp:27:54:从这里开始需要../../../build/pc/include/Poco/AutoPtr.h:263:7:错误:“bool Poco::AutoPtr::operator==(C*)const[with C=const Poco::Util::AbstractConfiguration]”不能重载bool operator==(C*ptr)常数
^../../../build/pc/include/Poco/AutoPtr.h:258:7:错误:带有'bool-Poco::AutoPtr::operator==(const C*)常量[带有C=const-Poco::Util::AbstractConfiguration]'bool operator==(const C*ptr)常量
^../../../build/pc/include/Poco/AutoPtr.h:278:7:错误:'boolpoco::AutoPtr::operator=(C*)const[with C=const Poco::Util::AbstractConfiguration]'不能重载布尔运算符!=(C*ptr)常数
^../../../build/pc/include/Poco/AutoPtr.h:273:7:错误:带有'bool-Poco::AutoPtr::operator=(const C*)const[with C=const Poco::Util::AbstractConfiguration]“bool运算符!”(常数C*ptr)常数
^../../../build/pc/include/Poco/AutoPtr.h:293:7:错误:'boolpoco::AutoPtr::operator=(C*ptr)const
^../../../build/pc/include/Poco/AutoPtr.h:333:7:错误:使用'bool-Poco::AutoPtr::operator>=(常量C*)常量[使用C=const-Poco::Util::AbstractConfiguration]'bool operator>=(常量C*ptr)常量
如何为const AbstractConfiguration创建AutoPtr*
UPD
如果使用
const Poco::AutoPtr<AbstractConfiguration> view = cfg.createView("live_time");
const Poco::AutoPtr view=cfg.createView(“实时”);
错误是
/home/evgen/projects/AuthService/Core/Module/src/LiveTimeConfig.cpp:27:错误:从“const-Poco::Util::AbstractConfiguration*”到“Poco::Util::AbstractConfiguration*”的转换无效[-fpermissive]
const Poco::AutoPtr view=cfg.createView(“实时”);
^
我不知道这个库,也不知道它的内部结构,但似乎它在内部操作const类型时有问题。但这不应该是个问题,因为,get
函数有两个重载,一个用于const
对象实例的重载返回const
指针。(const C*get()const;
)因此您可以使用:
const Poco::AutoPtr<AbstractConfiguration> view =
cfg.createView("live_time");
及
但是当您声明Poco::AutoPtr
时,两个重载具有相同的声明
bool operator == (
const AbstractConfiguration * ptr
) const;
调用编译错误
我不知道这个库,也不知道它的内部结构,但似乎它在内部操作const类型时有问题。但这不应该是个问题,因为,
get
函数有两个重载,一个用于const
对象实例的重载返回const
指针。(const C*get()const;
)因此您可以使用:
const Poco::AutoPtr<AbstractConfiguration> view =
cfg.createView("live_time");
及
但是当您声明Poco::AutoPtr
时,两个重载具有相同的声明
bool operator == (
const AbstractConfiguration * ptr
) const;
调用编译错误
仅使用const_cast成功构建和工作,但我认为这是黑客和气味代码
const Poco::AutoPtr<AbstractConfiguration> view = const_cast<AbstractConfiguration*>(cfg.createView("live_time"));
const Poco::AutoPtr view=const_cast(cfg.createView(“实时”);
仅使用const_cast成功构建和工作,但我认为这是黑客和气味代码
const Poco::AutoPtr<AbstractConfiguration> view = const_cast<AbstractConfiguration*>(cfg.createView("live_time"));
const Poco::AutoPtr view=const_cast(cfg.createView(“实时”);
Poco::AutoPtr假设引用计数,即修改对象内的计数器。这与对象的常量相冲突Poco::AutoPtr假定引用计数,即修改对象内的计数器。这与对象的常量冲突感谢您的详细回复。显然,无法为常量对象上的指针创建Poco::AutoPtr。P.S.const Poco::AutoPtr不工作。您所说的“const Poco::AutoPtr
不工作”是什么意思?它不编译吗?那么什么是错误呢?@KopysovEvgeniy在上面的评论中,忘了打电话感谢您的详细回复。显然,无法为常量对象上的指针创建Poco::AutoPtr。P.S.const Poco::AutoPtr不工作。您所说的“const Poco::AutoPtr
不工作”是什么意思?它不编译吗?那么什么是错误呢?@KopysovEvgeniy在上面的评论中说,忘了打电话了。我恐怕你不能用这种自动变速器的设计来避免它。您可以做的事情是将这个SO问题报告给AutoPtr的制作人,并使用std::make_unique之类的东西在const_cast上创建包装器(以便在修复后可以轻松删除它)。如果需要的话,我可以在几个小时内做一些例子。恐怕你不能用这种自动变速器的设计来避免它。您可以做的事情是将这个SO问题报告给AutoPtr的制作人,并使用std::make_unique之类的东西在const_cast上创建包装器(以便在修复后可以轻松删除它)。如果需要,我可以在几个小时内做一些例子