GCC 4.6 和缺少的可变模板扩展
GCC 4.6 and missing variadic-templates expansions
我正在使用此代码使用可变参数模板创建多个函数包装器:
// Compile with g++ -std=c++0x $(pkg-config sigc++-2.0 --cflags --libs) test.cpp -o test
#include <iostream>
#include <type_traits>
#include <sigc++/sigc++.h>
template <typename R, typename G, typename... Ts>
class FuncWrapper
{
public:
FuncWrapper(G object, std::string const& name, sigc::slot<R, Ts...> function) {};
};
int main()
{
FuncWrapper<void, int, int, bool, char> tst(0, "test", [] (int a, bool b, char c) {});
return EXIT_SUCCESS;
}
由于已知问题,此代码使用 clang++ 正确编译,但无法使用 g++ 正确编译:
test.cpp:9:73:抱歉,未实现:无法展开"Ts ..."变成一个 固定长度参数列表
我知道 gcc-4.7 应该正确处理这个问题,但我暂时无法升级......所以我想有一个解决方法来Ts...
正确解压缩。我已经在这样的问题中测试了这里的建议,但它们似乎并没有解决这里的问题。
您可以通过以下方式解决此错误:
template<template <typename...> class T, typename... Args>
struct Join
{ typedef T<Args...> type; };
然后将sigc::slot<R, Ts...>
替换为typename Join<sigc::slot, R, Ts...>::type
(感谢克里斯·杰斐逊对海湾合作委员会错误报告的建议)
相关文章:
- 如何在macOS中的旧扩展clang和gcc编译器中初始化数组和向量
- 带有 gcc 和 clang 的可变参数宏扩展的奇怪行为
- 为什么gcc会破坏递归扩展宏
- 在折叠表达式中扩展参数包作为 lambda 捕获的一部分 - gcc 与 clang
- GCC vs CLANG:将捕获的参数包扩展两次
- c++:gcc 是否提供扩展宏/函数,例如数组大小"countof"?
- gcc矢量扩展中未对齐的加载/存储
- 利用gcc和clang进行多参数包扩展
- 将参数包扩展到具有折叠表达式的lambda -GCC与Clang
- GCC 不接受默认模板参数中的包扩展
- GCC与Visual Studio宏观扩展
- 未记录的GCC扩展:结构中的VLA
- 为内存管理扩展GCC
- GCC 的扩展初始值设定项列表警告
- GCC 4.6 和缺少的可变模板扩展
- gcc 扩展或宏,用于在编译时检查用于某些基本类型的位
- 是否有用于 c++ 短路的 gcc 扩展
- 初始化带有大括号的VLA是GCC错误或扩展
- 在x64平台上的GCC中,默认情况下为扩展精度
- 作为GCC 4.9扩展的正则函数中的参数,是auto