Использование шаблонов с анонимными классами в рамках функции - PullRequest
4 голосов
/ 11 января 2011

Допустим, у меня есть следующий фрагмент:

template <class T> void f(T arg) { arg(); }

void g()
{
   struct { void operator()(void) { } } foo;

   f(foo);
}

Visual C ++ принимает это.Тем не менее, когда я пробую GCC, я получаю:

$ g++ --version # just in case this matters
g++ (Debian 4.4.5-8) 4.4.5
...
$ g++ foo.cc
foo.cc: In function 'void g()':
foo.cc:7: error: no matching function for call to 'f(g()::<anonymous struct>&)'

Когда глобальная область действия foo имеет тип с именем, это работает.Но когда тип является анонимным или , объявленным внутри g(), это не так.

Почему GCC отклоняет это?Это действительно C ++?

Ответы [ 2 ]

7 голосов
/ 11 января 2011

14.3.1 пункт 2:

Локальный тип, тип без связи, безымянный тип или тип составные из любого из этих типов не должны использоваться в качестве Templateargument для шаблона typeparameter.

Другими словами, недействительно. Хотя это было бы удобно для IMO, возможно, именно поэтому VC позволяет это.

2 голосов
/ 11 января 2011

Как уже говорилось, локальный класс (класс, определенный внутри функции) не может использоваться в качестве аргумента шаблона. К счастью, C ++ 0x исправляет это с помощью лямбда-функций: http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_functions_and_expressions

...