GCC 4.6和缺少可变参数模板扩展

时间:2012-07-02 16:13:04

标签: c++ gcc c++11 g++ variadic-templates

我正在使用此代码使用可变参数模板创建多个函数包装器:

// 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...正确解压缩。我在this one这样的问题中测试了这里建议的内容,但它们似乎没有在这里解决问题。

1 个答案:

答案 0 :(得分:5)

您可以使用以下方法解决错误:

template<template <typename...> class T, typename... Args>
struct Join
{ typedef T<Args...> type; };

然后将sigc::slot<R, Ts...>替换为typename Join<sigc::slot, R, Ts...>::type

(感谢Chris Jefferson关于GCC bug report的建议