- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我为这个例子的冗长道歉,我从一个项目中设计出来的。注释,第 1 项和第 2 项在以下代码中很重要。
#include <boost/intrusive/set.hpp>
struct x : public boost::intrusive::set_base_hook<>
{
int y;
};
struct finder
{
bool operator()(const int & i, const x & _x) const
{ return i < _x.y;}
bool operator()(const x & _x, const int & i) const
{ return _x.y < i;}
};
class trampoline
{
public:
void bounce() const /* item 1 */
{
/*item 2*/
boost::intrusive::set<x>::iterator it = _set.find(1,finder());
}
boost::intrusive::set<x> _set;
};
int main()
{
trampoline t;
t.bounce();
}
我不能将非 const 迭代器带到我的成员容器(第 2 项),其中范围内的函数是 const,如果我将迭代器切换到 const_iterator 一切正常,或者如果我将封闭函数设为非 const也有效。完全有道理,现在,经过一个小时的逆向工程后,出现以下错误消息的问题:
test.cc: In member function ‘void trampoline::bounce() const’:test.cc:21: error: conversion from ‘boost::intrusive::tree_iterator<boost::intrusive::rbtree_impl<boost::intrusive::setopt<boost::intrusive::detail::base_hook_traits<x, boost::intrusive::rbtree_node_traits<void*, false>, (boost::intrusive::link_mode_type)1u, boost::intrusive::default_tag, 3>, std::less<x>, long unsigned int, true> >, true>’ to non-scalar type ‘boost::intrusive::tree_iterator<boost::intrusive::rbtree_impl<boost::intrusive::setopt<boost::intrusive::detail::base_hook_traits<x, boost::intrusive::rbtree_node_traits<void*, false>, (boost::intrusive::link_mode_type)1u, boost::intrusive::default_tag, 3>, std::less<x>, long unsigned int, true> >, false>’ requested
这最终让我想到了以下模板定义 (/include/boost/intrusive/detail/tree_node.hpp +72):
/////////////////////////////////////////////////////////////////////////////
// //
// Implementation of the tree iterator //
// //
/////////////////////////////////////////////////////////////////////////////
// tree_iterator provides some basic functions for a
// node oriented bidirectional iterator:
template<class Container, bool IsConst>
够了所以说我很快就解决了问题......
该模板是如何从封闭函数的调用点传递 IsConst
的?我的大脑准备爆炸(据我所知,这很简单,但我很困惑)。详细解释并逐步实现以解释机制会很有帮助。
我有一个类似的问题here类似于 C++ 模板机制的类型推导/别名。引用是值得赞赏的,但它们需要被仔细考虑到知识中:D。如果您有耐心回答这个问题,您可能想尝试就另一个问题展开讨论。
最佳答案
boost::intrusive::set
的 find() 成员函数不会有一个 const 和非常量重载吗?我的意思是,我会这样做:
template <typename T /*...*/ >
class set {
//...
public:
template <bool isConst>
class iterator {
//....
};
iterator<true> find(/*..*/) const; //notice the const
iterator<false> find(/*..*/); //notice no const
};
这真的不是元编程魔术,只是很好的老式常量正确性。
关于C++ Template meta-magic, template call-site qualification deduction机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5329033/
这是我的 previous question 的后续,其中明显的共识是对纯右值的 cv 限定的处理变化只是一个相当小的和无关紧要的变化,旨在解决一些不一致的问题(例如,函数返回纯右值并用 cv 限定的
这是来自 ISO 的要点:标准转换:数组到指针的转换:$4.4:资格转换/第 5 点 A multi-level pointer to member type, or a multi-leve
这些错误是什么意思? Vector.cpp:13: error: ISO C++ forbids declaration of ‘Vector’ with no type Vector.cpp
我正在尝试使用模板元编程实现正弦函数。但是,由于 cv-qualification 冲突,我收到错误“radtest”不是 double & 的有效模板参数。这是代码: #include using
我正在努力完成我在类里面无法完成的教程,但我很难找出我的错误。我以前从未见过明确的资格错误,所以我什至不确定从哪里开始。我可以在网上找到的唯一资源是在使用 namespace 时必须做的此类错误,我认
struct istruct { const int i; }; const int i = 1; struct istruct is = {1}; void *voidp_i = &i; //
This similar ill-fated question在它关闭之前得到了评论和简短的回答,大意是:因为那是语言是如何定义的。在这里,我要求证据在C++ 标准就是这么定义的。 gcc 4.8.1
起初,我认为错误是因为有 void minimax::在 observe 之前功能,但是当我删除它时,增加了更多错误。谁能帮我理解这里的问题是什么? 最佳答案 这是声明成员函数的代码块: void M
根据 dcl.ref/1 : Cv-qualified references are ill-formed except when the cv-qualifiers are introduced t
battleutils.cpp:1037: error: explicit qualification in declaration of 'int32 battleutils::AbilityBen
假设我有三个 bean 和一个用于测试的类。 @Service @Qualifier("G1") Public class GlA1 implements GLAInterface {// code.
当使用 gcc 4.7 编译以下 C++11 程序时: extern int i; int ::i; int main() { } gcc 提示说: error: explicit qualifica
C++ 标准要求所有符合规范的实现都支持 main 的以下两个签名: int main(); int main(int, char*[]); 如果是后一种签名,添加(顶级)const 是否会破坏任何语
这是在我尝试提交我的应用程序进行测试时弹出的 If you are making use of ATS or making a call to HTTPS please note that you a
我最初雇用某人为我编写一个 dll,我使用的是他给我的已编译的 dll,但它有一个我需要删除的 msgbox 弹出窗口。所以我从代码中删除了它并重新编译。他的代码需要 QtCore 库,所以我下载并安
我收到一个错误extraqualification 'student::' on member 'student' [-fpermissive]。 还有为什么 name::name 这样的语法会用在构
在 Spring ,您可以对 bean 进行 XML 配置以具有限定符。如果通过 Java 注释配置 bean,我似乎无法找到如何附加限定符。那是怎么回事?我必须使用简单的旧名称吗? 最佳答案 如果您
我正在使用 gcc 8.0.0 201706 尝试一个关于 1z 的推导指南的示例(无法使用 clang 5.0.5 编译代码)。 namespace std { template std::
我正在尝试解决 Google CodeJam 2017 "Bathroom Stalls" problem C - 链接中提供了解决方案,下面我的 C# 代码在 small1 和 2 集上运行良好。大
我为这个例子的冗长道歉,我从一个项目中设计出来的。注释,第 1 项和第 2 项在以下代码中很重要。 #include struct x : public boost::intrusive::set_
我是一名优秀的程序员,十分优秀!