Перегрузка шаблонов наследования и функций-членов - PullRequest
3 голосов
/ 18 декабря 2011

Я пытаюсь скомпилировать следующий код с помощью clang (версия 3.0), но он выдает мне эту ошибку

error: no matching member function for call to 'a'

в вызове __a.a<0>().Затем я пытаюсь с g ++ (версия 4.2.1), и он компилируется и работает как положено (распечатка 1 2).

#include <iostream>

struct A {
  template <int> int a() { return 1; }
};

struct B: A {
  using A::a;
  template <int,int> int a() { return 2; }
};

int main(int, char **) {
  B __a;
  std::cout << __a.a<0>() << " "  << __a.a<0,0>() << std::endl;
  return 0;
}

Я пытаюсь посмотреть на стандарт, но я не нашел ничего, что объясняетчто является правильным поведением компилятора.Теперь мой вопрос: какое поведение правильное, и если clang работает правильно, как я могу изменить свой код, чтобы он работал как положено?

1 Ответ

2 голосов
/ 18 декабря 2011

Копаясь в стандартах C ++ 03 и C ++ 11, ваш код выглядит не очень корректным и корректным.C ++ 03, по-видимому, допустил это, в то время как изменение в формулировке стандарта C ++ 11, похоже, запретило это.

§7.3.3 [namespace.udecl] (Both standards)

p12 (C++ 03) Когда using-объявление переносит имена из базового класса в область производного класса, функции-члены в производном классе переопределяют и / или скрывают функции-члены с одинаковыми именами и типами параметров в базекласс (а не конфликтующие).

Обратите внимание, что в этой формулировке не упоминаются шаблоны функций-членов.

p15 (C ++ 11) Когда using-объявление переносит имена из базового класса в область производного класса, функции-члены и шаблоны функций-членов в производном классе переопределяют и / или скрывают функции-члены и шаблоны функций-членов с одинаковыми именами, параметр-тип-список (8.3.5), cv-qualification и ref-qualifier (если есть) в базовом классе (а не конфликтующий).

Обратите внимание на упоминание шаблонов функций-членов вновыйформулировка.Также обратите внимание, что в списке, который определяет, переопределяет / скрывает ли член производного класса элемент базового класса, не упоминается template-parameter-list шаблона функции-члена в качестве идентифицирующей точки, он игнорируетсядля этой цели.

Я мог бы истолковать это совершенно неправильно, но кажется, что Clang является соответствующим компилятором, а GCC, а также MSVC10 не соответствуют этой новой формулировке.

...