Почему вызовы функций для шаблонизированных базовых классов не работают? - PullRequest
2 голосов
/ 20 февраля 2010

Рассмотрим следующий пример:

template <typename T>
class A {
    public:
        void f() {
            cout << "A::f()\n";
        }
};

template<>
class A<int> {
};

template<typename T>
class B: public A<T> {
    public:
        void g() {
            cout << "B::g()\n";
            A<T>::f();
        }
};

int main() {
    B<int> b;     // (1)
    b.g();        // (2)

    return 0;
}

Очевидно, что вызов A :: f () внутри B :: g () не удастся для типа шаблона int. У меня вопрос, в какой момент вызов не удался? На (1) или (2)? Я думал, что это должно быть (1), потому что в этот момент компилятор создает новый класс с типом шаблона int и компилирует его. Эта компиляция должна завершиться ошибкой в ​​f ()?

Ответы [ 2 ]

4 голосов
/ 20 февраля 2010

Не удастся при (2), и это гарантировано стандартом.В разделе 14.7.1 / 1 говорится, что создание экземпляра класса шаблона не создает определения его членов.Это произойдет только после использования элемента.

Если вы удалите (2) из ​​кода, он скомпилируется.

14.7.1 / 1 отрывок:
неявная реализация специализации шаблона класса вызывает неявную реализацию объявлений, , но не определений или аргументов по умолчанию, функций-членов класса, классов-членов, статических членов-данных и шаблонов элементов ;и это вызывает неявную реализацию определений членских анонимных союзов.

Выделение мое.


Диагноз Visual Studio вводит в заблуждение.Это скажет see reference to class template instantiation 'B<T>' being compiled.Это означает не «я не могу создать экземпляр B<T>», но «я не могу создать экземпляр члена класса B<T>»

3 голосов
/ 20 февраля 2010

Не удается на 2). Функция-член шаблонов создается при вызове.

Точнее: при создании экземпляра шаблона класса создаются объявления его функций-членов, но не их определение. Определение создается при использовании функции.

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