- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在 GCC 上使用 C++11 进行可变参数模板编程时,偶尔会收到一条错误消息,提示“抱歉,未实现:无法将 '标识符...' 扩展为固定长度的参数列表。”如果我删除代码中的“...”,我会得到一个不同的错误:“错误:参数包没有用'...'扩展”。
因此,如果我输入了“...”,则 GCC 将其称为错误,如果我将“...”取出,则 GCC 也将其称为错误。
我能够处理这个问题的唯一方法是使用不同的方法从头开始完全重写模板元程序,并且(幸运的是)我最终想出了不会导致错误的代码。但我真的很想知道我做错了什么。尽管谷歌搜索并进行了大量实验,但我无法确定我在产生此错误的可变参数模板代码和没有错误的代码之间所做的不同。
错误消息的措辞似乎暗示代码应该按照 C++11 标准工作,但 GCC 还不支持它。或者它可能是一个编译器错误?
这是一些产生错误的代码。注意:我不需要您为我编写正确的实现,而只是指出导致此特定错误的代码是什么
// Used as a container for a set of types.
template <typename... Types> struct TypePack
{
// Given a TypePack<T1, T2, T3> and T=T4, returns TypePack<T1, T2, T3, T4>
template <typename T>
struct Add
{
typedef TypePack<Types..., T> type;
};
};
// Takes the set (First, Others...) and, while N > 0, adds (First) to TPack.
// TPack is a TypePack containing between 0 and N-1 types.
template <int N, typename TPack, typename First, typename... Others>
struct TypePackFirstN
{
// sorry, unimplemented: cannot expand ‘Others ...’ into a fixed-length argument list
typedef typename TypePackFirstN<N-1, typename TPack::template Add<First>::type, Others...>::type type;
};
// The stop condition for TypePackFirstN: when N is 0, return the TypePack that has been built up.
template <typename TPack, typename... Others>
struct TypePackFirstN<0, TPack, Others...> //sorry, unimplemented: cannot expand ‘Others ...’ into a fixed-length argument list
{
typedef TPack type;
};
编辑:我注意到,虽然看起来像的部分模板实例化确实会导致错误:
template <typename... T>
struct SomeStruct<1, 2, 3, T...> {};
重写它不会产生错误:
template <typename... T>
struct SomeStruct<1, 2, 3, TypePack<T...>> {};
似乎您可以声明部分特化的参数是可变参数的;即这条线没问题:
template <typename... T>
但你实际上不能使用特化中的那些参数包,即这部分不行:
SomeStruct<1, 2, 3, T...>
事实上,如果你将包包装成其他类型,你就可以让它工作,例如:
SomeStruct<1, 2, 3, TypePack<T...>>
对我来说意味着对部分模板特化的可变参数的声明是成功的,你只是不能直接使用它。谁能证实这一点?
最佳答案
有一个技巧可以让它与 gcc 一起工作。该功能尚未完全实现,但您可以构建代码以避免未实现的部分。手动将可变参数模板扩展为参数列表是行不通的。但是模板特化可以为您做到这一点。
template< char head, char ... rest >
struct head_broken
{
static const char value = head;
};
template< char ... all >
struct head_works; // make the compiler hapy
template< char head, char ... rest >
struct head_works<head,rest...> // specialization
{
static const char value = head;
};
template<char ... all >
struct do_head
{
static const char head = head_works<all...>::value;
//Sorry, unimplemented: cannot expand 'all...' into a fixed-length arugment list
//static const char head = head_broken<all...>::value;
};
int main
{
std::cout << head_works<'a','b','c','d'>::value << std::endl;
std::cout << head_broken<'a','b','c','d'>::value << std::endl;
std::cout << do_head<'a','b','c','d'>::head << std::endl;
}
我用 gcc 4.4.1 对此进行了测试
关于c++ - 可变参数模板 : "Sorry, unimplemented: cannot expand ' Identifier. 的 GCC 错误。 .' into a fixed-length argument list",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1989552/
从父类(super class)继承抽象方法时,Eclipse IDE 中是否有键盘快捷键可以添加未实现的方法?总是需要点击类名来执行此操作,这有点烦人。谢谢 最佳答案 Ctrl+. 然后 Ctrl1
通过接口(interface)生成一个类后,我需要一个与 Eclipse 的“添加未实现的方法”功能具有相同功能的方法。我搜索了它,但找不到任何东西。有没有什么办法可以使用,比如插件扩展点之类的? 谢
我在尝试运行我的应用程序时遇到以下错误 fatal error :对类“rcresttest.CatalogItem”使用了未实现的初始化程序“init(entity:insertIntoManage
我在这条指令之后创建了一个 grpc 服务器和客户端:https://docs.microsoft.com/en-us/aspnet/core/tutorials/grpc/grpc-start?vi
此代码显示添加未实现的方法时出现错误。 public class Child implements IResponse 但这没有显示错误。 public class Child extends Pa
有人可以向我解释一下这两个代码块之间的区别吗?第一个可以工作,而后者会抛出我在标题中指出的错误。 def login_required(method): @functools.wraps(method
Eclipse 有一个功能“添加未实现的方法”,可以为一个类添加未实现的方法(例如在实现接口(interface)时)。 当 Eclipse 添加方法时,它会按字母顺序添加它们。有没有一种方法可以配置
我在以下行收到主题警告: NSSortDescriptor * sort = [ [NSSortDescriptor alloc] initWithKey:@"name"
基本上我的数据模型中有 3 个实体:Brand、Model 和 Trim。 品牌与称为“模型”的模型具有一对多关系。 (一个品牌有多个型号,但一个型号只有一个品牌) 模型与 Trim 之间存在多对多关
我正在 Windows 10 WSL2 上测试 Rails 项目。我能够运行 rails server没问题,但是当我运行 rails test test/integration , 我得到 NotI
当我运行以下 .Net 代码时: using (var c = Shared.DataSources.BSS1.CreateCommand()) { c.CommandText = "\r\n
我正在使用 Java 开发 Selenium 并使用监听器。 我创建了该类,导入了 TestNG,然后添加了方法; Public class Listener implements ITestList
使用 Springboot 入门应用程序。一切正常。然后我将客户端和服务器移动到新的包中。一切都会编译,但在运行时,当我运行客户端时,我收到错误:未找到未实现的方法。 我检查了该方法确实已实现。当我启
我正在尝试运行 "Alien Shooter" Android/SDL example在我的新Samsung Galaxy Fit .我没有更改任何代码的初始状态。在模拟器上一切正常,但在真实设备上,
我正在开发一个使用 OpenGL 的 Android 应用程序,我想在一个类(渲染器)中添加这些方法以获得场景的两个 View ,即自动立体设备使用的图像: package com.s.cv; imp
如果您正处于 TDD 迭代的中间,您如何知道哪些测试失败是因为现有代码确实不正确,哪些失败是因为测试本身或功能尚未实现?请不要说,“你只是不在乎,因为你必须同时解决这两个问题。”我已经准备好摆脱这种心
我想在我的导航栏上放一张图片和标签,所以我决定这样做: class FixedImageNavigationItem: UINavigationItem { private let fixed
我们正在运行带有连接池的 tomcat 服务器,最近随机出现此错误。当我们随机运行一个包中的存储过程时,就会发生这种情况。我已经尝试自己对问题进行一些研究,这导致了这个 Java 类的来源,我认为错误
我是 iPhone 开发新手。我正在尝试使用 iphone 核心数据存储一些数据。当我尝试保存时,我收到类似错误。 Detected an attempt to call a symbol in sy
所以我有两种不同的方法。 一个是普通方法 void DoSomething(delegate x) { foreach(......) { x(); } } 另一个是部分但未实现的
我是一名优秀的程序员,十分优秀!