Вызов функции-члена класса шаблона через указатель [почему это допустимый c ++]? - PullRequest
0 голосов
/ 05 сентября 2018

Я искал источник для большого кода молекулярной динамики и нашел то, что я не понимаю. Я создал простой тестовый пример в файле с именем test.cpp (показан ниже):

template <class T> class Test {
  public:
    void testFunc() {
      T *ptr1;
      ptr1 = ptr1.function();
    }
}

Это прекрасно компилируется с GNU G ++, а также с Intel ICPC, если вы вызываете компилятор следующим образом:

$CXX -o test.o -c test.cpp

Я не понимаю, почему это правильный синтаксис c ++. Чтобы получить доступ к function(), который никогда не был определен в первую очередь, мне нужно разыменовать ptr1 или использовать оператор ->.

Компиляторы читают эту ситуацию иначе, чем я?

Если вы хотите увидеть исходный источник, где я нашел это, проверьте строки 556 и 595 этого файла: https://www.ks.uiuc.edu/Research/namd/doxygen/MsmMap_8h-source.html

Спасибо

1 Ответ

0 голосов
/ 05 сентября 2018

Ответ в том, что это недопустимый синтаксис C ++.
Помните, Test - это не класс, это шаблон для класса. Это ваши инструкции для компилятора о том, как приступить к созданию класса Test для определенного типа T , если вы об этом попросите. Вы не просили об этом.

Попробуйте добавить что-то вроде

Test< int > *test = new Test< int >();
test->testFunc();

Вы должны получить ошибку вроде

error: request for member 'function' in 'ptr1', which is of non-class type 'int*'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...