- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么在将 #if 0 更改为 #if 1 时出现“错误 C1202:递归类型或函数依赖上下文太复杂”错误?错误版本更简单,我宁愿使用类似的东西。
我正在尝试编写一个散列函数,以消除编译时间常数长度的循环。真正的哈希函数要复杂得多,这里只是一个简单的例子。
typedef unsigned __int8 U1;
typedef unsigned __int16 U2;
typedef unsigned __int32 U4;
#define AS1(a_) (*(U1*)(a_))
#define AS2(a_) (*(U2*)(a_))
#define AS3(a_) ((U4(((U1*)(a_))[2])<<16) | AS2(a_))
#define AS4(a_) (*(U4*)(a_))
#if 0
template<U4 CB> U4 Hash(const char* sz, int n = 0) {
if (CB >= 4) return Hash<CB - 4>(sz + 4, n ^ AS4(sz));
if (CB == 3) return n ^ AS3(sz);
if (CB == 2) return n ^ AS2(sz);
if (CB == 1) return n ^ AS1(sz);
}
#else
template<U4 CB> U4 Hash(const char* sz) {
return Hash<CB - 4>(sz + 4, Hash<4>(sz));
}
template<U4 CB> U4 Hash(const char* sz, int n) {
return Hash<CB - 4>(sz + 4, Hash<4>(sz, n));
}
template<> U4 Hash<1>(const char* sz, int n) { return n ^ AS1(sz); }
template<> U4 Hash<2>(const char* sz, int n) { return n ^ AS2(sz); }
template<> U4 Hash<3>(const char* sz, int n) { return n ^ AS3(sz); }
template<> U4 Hash<4>(const char* sz, int n) { return n ^ AS4(sz); }
template<> U4 Hash<1>(const char* sz) { return AS1(sz); }
template<> U4 Hash<2>(const char* sz) { return AS2(sz); }
template<> U4 Hash<3>(const char* sz) { return AS3(sz); }
template<> U4 Hash<4>(const char* sz) { return AS4(sz); }
#endif
int main(int argc, char* argv[])
{
char* sz = "123456789";
int n = Hash<9>(sz);
n += Hash<3>(sz);
return n;
}
最佳答案
问题是这个函数在编译时是无限递归的:
template<U4 CB> U4 Hash(const char* sz, int n = 0) {
if (CB >= 4) return Hash<CB - 4>(sz + 4, n ^ AS4(sz));
if (CB == 3) return n ^ AS3(sz);
if (CB == 2) return n ^ AS2(sz);
if (CB == 1) return n ^ AS1(sz);
}
当然,你有 if
语句,所以如果你调用 Hash<3>
你真的不希望它想要实例化 Hash<-1>
...但是在模板中,必须实例化整个函数体。 Twig 只会在以后被修剪。所以不管CB
的值如何, Hash
的任何实例化将继续实例化越来越多的 CB
值(例如 Hash<9>
需要 Hash<5>
需要 Hash<1>
需要 Hash<-3>
需要 Hash<-7>
...)直到它达到编译器模板递归限制或编译器刚好用完内存
另一方面,如果您明确特化所有情况:
template<U4 CB> U4 Hash(const char* sz, int n = 0) {
return Hash<CB - 4>(sz + 4, n ^ AS4(sz));
}
template <> U4 Hash<3>(const char* sz, int n = 0) {
return n ^ AS3(sz);
}
// etc.
然后是 Hash<9>
的实例化将导致 Hash<5>
的实例化, 然后 Hash<1>
只是一个明确的特化,过程就此停止。
这就是为什么在涉及模板元编程时,您应该将特化视为您的分支和基本递归案例。不要考虑实际的运行时早午餐。
关于c++ 11递归类模板到复杂错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27935471/
我正在用 Python 编写一个 ETL 脚本,用于获取 CSV 文件中的数据、验证和清理数据以及根据某些规则对每一行进行分类或分类,最后将其加载到 postgresql 数据库中。 数据看起来像这样
我在做一个项目,想实现一个类似于 wordpress posts 表的 posts 表来存储页面内容。 所以我基本上复制了 wp_posts 表,它是 longtext 但是我注意到在整理下它有 ut
在使用 MySQL 一段时间后,我第一次尝试使用 PostgreSQL 数据库。我的环境是与 cPanel 和 phpPgAdmin 共享主机。令我困惑的一件事是数据库整理。我的主机的 cPanel
在一些指南的帮助下,我成功地使用 gcc 编译了 sqlite3 的 ICU 扩展并获得了 libSqliteIcu.so,没有显示任何错误。然后我将这个 lib 复制到/usr/lib 文件夹。之后
我搜索了一个 JQuery 插件,但没有成功,该插件能够根据其内容过滤 HTML 列表(li、div 或其他列表)。我发现了很多,但似乎没有一个支持 MySQL 中所谓的排序规则(当然在其他地方也是如
我正在尝试将我的一个数据库表从 utf8_general_ci 切换到 utf8mb4。 ALTER TABLE d4b80le1jha CONVERT TO CHARACTER SET utf8mb
我是一名优秀的程序员,十分优秀!