Неоднозначность вложенного шаблона - PullRequest
1 голос
/ 27 сентября 2019

Вложенные шаблоны требуют использования ключевого слова template, как описано в этом ответе .Вот краткая демонстрация, которая приводит к ошибке компилятора:

template <int T>
struct A {
  template <int U>
  static void b(int x) {
  }
};

template <int T>
void test() {
  A<T>::b<T>(T); // Should be:
  // A<T>::template b<T>(T);
}

int main() {
  test<0>();
}

В качестве проблемы я пытался представить программу, в которой две возможности (с template или без) обе действительны, но имеют две разныесмыслы, но я не мог обернуться вокруг оператора, перегружающего бизнес.Можно ли сделать A<T>::b<T>(T); действительным утверждением?

1 Ответ

0 голосов
/ 27 сентября 2019

Если вы измените struct A на:

template <int T>
struct A {
    static const int b = 5;
};

, тогда A<T>::b<T>(T); скомпилируется.

  • В этом случае A<T>::b будет равно 5.
  • T равно 0.
  • Таким образом, 5 <0 является ложным (0) </li>
  • 0 > (0) также ложно;

Если вы замените код на что-то вроде:

auto x = A<T>::b<T>(T);
std::cout << typeid(x).name() << " " << x;

Вы получите:

bool 0

Таким образом, было несложно изменить A, чтобы A<T>::b<T>(T) был действительным утверждением.

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