模板'使用'声明无效

时间:2011-11-03 19:29:00

标签: c++ c++11

我有以下小测试应用程序,我正在尝试使用模板使用声明。

然而,它没有编译。 (我正在使用gcc 4.6.1)

  

src / main.cpp:36:3:错误:在'使用'之前预期的unqualified-id

  • 我的使用声明是否有效c ++?
  • 是否可以创建模板别名而无需为其中一个模板参数指定类型?
  • 是否可以使用可变参数模板创建模板别名?

非常感谢任何见解!

#include <iostream>
#include <utility>

template<typename F, typename... Args>
struct invoke;

// specialisation of invoke for 1 parameter
template<typename F, typename A0>
struct invoke<F, A0>
{
  invoke(F& f_, A0&& a0_)   
    : _f(f_)
    , _a0(std::move(a0_))
  {} 

  void operator()()
  {
    _f(_a0);
  } 

  F _f;
  A0 _a0;
};

template<typename F>
struct traits;

// fwd declaration for handler
struct handler;

// specialisation of traits for handler
template<>
struct traits<handler>
{
  template<class F, typename... Args>
  using call_t = invoke<F, Args...>;               // line 36
};

template<typename F>
struct do_it
{
  template<typename... Args>
  void operator()(F& _f, Args... args)
  {
    // create an object of the type declared in traits, and call it
    typename traits<F>::template call_t<F, Args...> func(_f, std::forward<Args>(args)...);
    func();
  }
};

struct handler
{
  void operator()(int i)
  {
    std::cout << i << std::endl; 
  }
};

int main()
{
  handler h;

  do_it<handler> d;
  d(h, 4);

  return 0;
}

1 个答案:

答案 0 :(得分:3)

根据这个:http://wiki.apache.org/stdcxx/C++0xCompilerSupport和此:http://gcc.gnu.org/projects/cxx0x.html

模板别名不在GCC 4.6中\应该有一个修补它的补丁。

(我可能会误以为您使用的是模板别名,因此这可能不适用于您。我对C ++ 11不是很熟悉)