我在以下代码中从 g++
3.3 收到一个奇怪的错误:
#include <bitset>
#include <string>
using namespace std;
template <int N, int M>
bitset<N> slice_bitset(const bitset<M> &original, size_t start) {
string str = original.to_string<char, char_traits<char>, allocator<char> >();
string newstr = str.substr(start, N);
return bitset<N>(newstr);
}
int main() {
bitset<128> test;
bitset<12> result = slice_bitset<12, 128>(test, 0);
return 0;
}
错误如下:
在函数 `std::bitset slice_bitset(const std::bitset&, unsigned int)' 中:
',' 标记前的语法错误
`char_traits' 指定为 declarator-id
`char_traits' 声明中的两个或多个数据类型
`allocator' 指定为 declarator-id
`allocator' 声明中的两个或多个数据类型
`>' 标记前的语法错误
这一定是一件非常愚蠢的事情,但我已经把它告诉了我的橡皮鸭和一个朋友,但无济于事。
谢谢,懒人网。
原文由 cdleary 发布,翻译遵循 CC BY-SA 4.0 许可协议
CAdaker 选择的答案解决了问题,但没有解释 为什么 它解决了问题。
解析函数模板时,不会在依赖类型中进行查找。因此,可以解析如下结构:
然而,这个“特性”是有代价的,在这种情况下,“foo”的定义需要对模板“B”的内容进行提示。如果 ‘foo’ 使用嵌套类型 ‘B’,则需要
typename
关键字来告诉编译器该名称是一个类型:上面没有’typename’,编译器将假定
X
是一个对象(或函数)。类似地,如果调用成员函数并且调用具有显式模板参数,则编译器需要知道将
<
视为模板参数列表的开头,而不是小于运算符:如果没有
template
,编译器会假定<
是小于运算符,因此在看到int>
时会生成语法错误,因为这不是表达式。即使 模板的定义可见,也需要这些提示。原因是显式特化可能会在以后更改实际选择的定义: