小编ds1*_*848的帖子

从模板类调用variadic参数函数

我有一个带有可变参数模板成员函数的模板类,我无法从类外部调用.这是我想要做的简化示例:

template<typename T>
struct foo{
    foo(){}

    template<int... I>
    int run(){
        return sizeof...(I); // or whatever
    }
};

template<int... I>
int run_int(){
    return foo<int>().run<I...>();  // OK
}

template<typename T, int... I>
int run_T(){
    return foo<T>().run<I...>(); // error
}
Run Code Online (Sandbox Code Playgroud)

当foo是专用的时候,我可以调用它的模板成员函数run()而没有任何问题.但是如果我尝试从不专门化foo的函数或结构中调用它,gcc(4.7)会发出一个错误,说"参数包没有用'...'扩展".我用clang(3.1)尝试了同样的事情,但得到了类似的错误("错误:表达式包含未展开的参数包'我'").

任何人都可以帮助我理解为什么最后一个函数无法编译?现在我可以通过使"int ... I"成为foo本身的非类型参数来解决它,然后从外部调用它:

 foo<T, I...>().run()
Run Code Online (Sandbox Code Playgroud)

但我仍然感到困惑的是为什么它不会以其他方式编译.

c++ gcc variadic-templates c++11

5
推荐指数
1
解决办法
904
查看次数

使用下半部分后取消引用64位寄存器

我有一个64位寄存器,它保存一个存储器地址.如果我对寄存器的下半部分执行算术运算然后尝试取消引用它,我会得到一个分段错误.这是一个例子:

movsx rax, BYTE PTR [rdi]  # ok
add edi, 1 # the address is correct but....
movsx rax, BYTE PTR [rdi] # segmentation fault here
Run Code Online (Sandbox Code Playgroud)

如果我在第2行将edi更改为rdi,那么我只是想知道为什么在这种情况下我不能使用rdi的下半部分.如果任何人有任何关于正确使用寄存器下部的信息的链接/参考,我也将不胜感激.

非常感谢你的帮助.

assembly x86-64

2
推荐指数
1
解决办法
574
查看次数

标签 统计

assembly ×1

c++ ×1

c++11 ×1

gcc ×1

variadic-templates ×1

x86-64 ×1