Как из определения класса вынести реализацию шаблонной функции

Тема в разделе "Общие вопросы по С и С++", создана пользователем Monarh, 25 авг 2009.

  1. Monarh

    Monarh Active Member

    Регистрация:
    14 фев 2009
    Сообщения:
    34
    Симпатии:
    0
    Здравствуйте.
    Подскажите пожалуйста как из определения класса вынести реализацию шаблонной функции ?
    То есть, чтобы в "h-файле" было определения класса внутри которого присутствует только объявление шаблонной функции, а
    реализация этой шаблонной функции находится в "cpp-файле".
    На примере:
    Есть класс Cls_A с общедоступной шаблонной функцией Func() в файле "A.h"
    Код (Text):
    class Cls_A
    {
    public:
    template<class T>
    void Func( T*& , const string& , const string& )
    {
    ...
    }
    };
    Как сделать так, чтобы в файле "A.h" в определении класса осталось только объявление шаблонной функции:
    Код (Text):
    class Cls_A
    {
    public:
    template<class T>
    void Func( T*& , const string& , const string& );
    };
    А в файле "A.cpp" была реализация этой шаблонной функции:
    Код (Text):
    export template<class T>
    void Func( T*& , const string& , const string& )
    {
    ...
    }
    Страуструп на эту тему пишет:
    "Для того, чтобы к нему(то есть, как я понимаю, к шаблону данной функции) можно было обратиться из различных единиц компиляции,
    определение шаблона должно быть явно объявлено с export. Это можно сделать, добавив export к определению или
    предварив им объявление. В противном случае определение должно находиться в области видимости в момент использования шаблона."

    Но, компилятор на это пишет:
    При копмиляции:
    Код (Text):
    warning: keyword `export' not implemented, and will be ignored
    При попытке запуска программы на выполнение:
    Код (Text):
    build/Debug/Cygwin-Windows/Source/Main.o: In function `main':
    /cygdrive/p/Quadrangle_Area_with_Curve_Boundary/Source/Main.cpp:50: undefined reference to `void Cls_Memory::Allocation<int>(int*&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    /cygdrive/p/Quadrangle_Area_with_Curve_Boundary/Source/Main.cpp:52: undefined reference to `void Cls_Memory::Allocation<double>(double*&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    ...
    Заранее всем большой спасибо.
     
  2. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Ваш компилятор не реализует export, следовательно реализацию вынести не получится
     
  3. Monarh

    Monarh Active Member

    Регистрация:
    14 фев 2009
    Сообщения:
    34
    Симпатии:
    0
    Жалко !!!

    Спасибо за ответ.
     
  4. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
  5. Monarh

    Monarh Active Member

    Регистрация:
    14 фев 2009
    Сообщения:
    34
    Симпатии:
    0
Загрузка...

Поделиться этой страницей