gpt4 book ai didi

C++参数包展开失败

转载 作者:行者123 更新时间:2023-11-30 02:39:56 25 4
gpt4 key购买 nike

我正在玩可变参数模板,但我不明白为什么以下代码无法编译(GCC 4.9.2 with std=c++11):

这只是一个例子,但我需要在我的代码中使用类似的类型,但它也失败了:

template<int I>
class Type{};
template<typename ... Tlist>
class A{
public:
template<int ...N>
void a(Type<N> ... plist){

}
};
template<typename ... Tlist>
class B{
public:
template<int ... N>
void b(Type<N> ... plist){
A<Tlist...> a;
a.a<N...>(plist ...);
}
};

以及使用示例:

B<int, int, int> b;
b.b<1,7,6>(Type<1>(),Type<7>(),Type<6>());

我收到以下错误:

file.cpp: In member function ‘void B<Tlist>::b(Type<N>...)’:
file.cpp:58:9: error: expected ‘;’ before ‘...’ token
a.a<N...>(plist ...);
^
file.cpp:58:24: error: parameter packs not expanded with ‘...’:
a.a<N...>(plist ...);
^
file.cpp:58:24: note: ‘N’

但是下面的代码编译得很好(我只是从两个类中删除了 Tlist 参数并相应地调整了代码):

template<int I>
class Type{};
class A{
public:
template<int ...N>
void a(Type<N> ... plist){

}
};
class B{
public:
template<int ... N>
void b(Type<N> ... plist){
A a;
a.a<N...>(plist ...);
}
};


B b;
b.b(Type<1>(),Type<7>(),Type<6>());

谁能给我解释一下?谢谢。

最佳答案

编译器没有理由相信 a.a是一个模板;因此,它必须解释 <作为小于运算符。写:

        a.template a<N...>(plist ...);
^^^^^^^^^

在你的第二个例子中,它知道 a.a是一个模板,因为 a 的类型不依赖于模板参数。

关于C++参数包展开失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29395688/

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