шаблон 'использование' декларация не работает - PullRequest
2 голосов
/ 03 ноября 2011

У меня есть следующее небольшое тестовое приложение, в котором я пытаюсь использовать шаблон , используя объявление .

Однако он не компилируется. (Я использую gcc 4.6.1)

src / main.cpp: 36: 3: ошибка: ожидаемый неквалифицированный идентификатор перед «использованием»

  • Является ли мое объявление действительным 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 Ответ

3 голосов
/ 03 ноября 2011

Согласно этому: http://wiki.apache.org/stdcxx/C++0xCompilerSupport и это: http://gcc.gnu.org/projects/cxx0x.html

Псевдонимы шаблона отсутствуют в GCC 4.6 \. Должен быть патч, который исправляет это.

(возможно, я ошибаюсь, что вы используете псевдонимы шаблонов, и это может не относиться к вам. Я не очень знаком с C ++ 11)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...