Функция шаблона передана в общую библиотеку (c ++) - PullRequest
2 голосов
/ 02 марта 2009

Немного о мысленном эксперименте ... Ингредиент 1: класс в (предварительно скомпилированной) разделяемой библиотеке, имеющий функцию, которая получает указатель на объект, полученный из ostream:

void ClassName::SetDefaultStream(std::ostream *stream)

Ингредиент 2:

Мой собственный класс, производный от std :: ostream, с некоторым обобщенным оператором шаблонного потока:

class MyStream : public std::ostream
{
   public:
      template <typename T> MyStream &operator<<(const T &data)
      {
         std::cout << data;
         return *this;
      }
}

Теперь, если я передам адрес экземпляра этого класса в метод SetDefaultStream, что произойдет? Во время компиляции компилятор не знает, какие типы будут применены к потоку в разделяемом классе, так что, конечно, никакой код не будет синтезирован? Будет ли он не скомпилироваться, скомпилируется, а затем потерпит крах при запуске, выйдет ли дым из компьютера?

Ответы [ 2 ]

6 голосов
/ 02 марта 2009

Ваш шаблонный мембер не будет виден внутри библиотеки, поскольку он не является виртуальным членом base std :: ostream. Никаких проблем не возникнет.

3 голосов
/ 02 марта 2009

он скомпилируется, но ваш оператор не будет вызван.

...