gpt4 book ai didi

C++ 声明中的两种或多种数据类型

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:05:19 24 4
gpt4 key购买 nike

我从 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;
}

错误如下:

In function `std::bitset slice_bitset(const std::bitset&, unsigned int)':syntax error before `,' token`char_traits' specified as declarator-idtwo or more data types in declaration of `char_traits'`allocator' specified as declarator-idtwo or more data types in declaration of `allocator'syntax error before `>' token

这一定是非常愚蠢的事情,但我已经告诉我的橡皮鸭和 friend 无济于事。

谢谢,Lazyweb。

最佳答案

选择的答案来自CAdaker解决了问题,但没有解释为什么它解决了问题。

解析函数模板时,不会在依赖类型中进行查找。因此,可以解析如下结构:

template <typename T>
class B;

template <typename T>
void foo (B<T> & b) {
// Use 'b' here, even though 'B' not defined
}

template <typename T>
class B
{
// Define 'B' here.
};

但是,此“功能”是有代价的,在本例中,“foo”的定义需要提示模板“B”的内容。如果 'foo' 使用嵌套类型的 'B',则 typename需要关键字来告诉编译器该名称是一种类型:

template <typename T>
void foo (B<T> & b)
{
typename B<T>::X t1; // 'X' is a type - this declares t1
B<T>::Y * t1; // 'Y' is an object - this is multiplication
}

上面没有'typename',编译器会假设X是一个对象(或函数)。

类似地,如果调用了一个成员函数并且该调用具有显式模板参数,那么编译器需要知道如何处理 <作为模板参数列表的开始而不是小于运算符:

template <typename T>
void foo (B<T> & b)
{
b.template bar<int> (0); // 'bar' is a template, '<' is start of arg list
b.Y < 10; // 'Y' is an object, '<' is less than operator
}

没有template , 编译器假定 <是小于运算符,因此当它看到 int> 时会产生语法错误因为那不是一个表达式。

当模板定义可见时,甚至需要这些提示。原因是显式特化稍后可能会更改实际选择的定义:

template <typename T>
class B
{
template <typename S>
void a();
};

template <typename T>
void foo (B<T> & b)
{
b.a < 10; // 'B<int>::a' is a member object
}

template <>
class B<int>
{
int a;
};

关于C++ 声明中的两种或多种数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/231868/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com