2015-07-01 2 views
2

Почему есть ошибка в этом коде:функция члена шаблона обрабатывается только если называется

template <typename T> 
    class CLs{ 
     public: 
     void print(T* p){ p->print(); } 
    }; 

    void main() { 
     CLs<int> c1; // compilation OK 
     CLs<double> c2; // compilation OK 
     double d=3; 
     c2.print(&d); 
    } 

Мой преподаватель сказал, что есть ошибка в c2.print(&d); линии:

Compilation Error: Member function is instantiated only if called.

Что он имеет в виду?

+2

переменная 'd' имеет тип' double', поэтому, когда вы вызываете 'c2.print (& d)' в теле функции, это как вызов 'd.print()', но d является конкретным типом и doesn ' t имеет функцию-член 'print'. – 101010

ответ

1

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

Ваши объявления CLs<T> компилируются автоматически, поскольку функция print не скомпилирована до ее использования. c2.print(&d) не удается скомпилировать, поскольку он вызывает создание CLs<double>::print, которое плохо сформировано.

Смежные вопросы