2010-11-24 2 views
6

Есть много онлайн-документов, объясняющих, как писать методы шаблонов, но не так много примеров их вызова, как их использовать в коде.Как вызвать метод шаблона?

У меня есть шаблонный метод, как это:

VectorConvertor.h

template <class T> 
static void AppendToVector(std::vector<T> & VectorToBeAppended, 
          std::vector<T> & VectorToAppend);


VectorConvertor.cpp

template <class T> 
void VectorConvertor::AppendToVector(std::vector<T> & VectorToBeAppended, 
            std::vector<T> & VectorToAppend) 
{ 
    for (std::vector::size_type i=0; i<VectorToAppend.size(); i++) 
    { 
     VectorToBeAppended.push_back(VectorToAppend.at(i)); 
    } 
}

попытка Использование в коде:

std::vector<uint8_t> InputData, OutputData; 
// ... 
VectorConvertor::AppendToVector(OutputData, InputData);


Я скомпилировать этот код без ошибок. Но когда я пытаюсь использовать этот метод, я получаю следующие ошибки:

ошибка LNK1120: 1 неразрешенных внешних

и

ошибка LNK2019: неразрешенный внешний символ «общественности: статический вакуум __cdecl VectorConvertor :: AppendToVector (класс std :: vector> &, класс std :: vector> &) "(?? $ AppendToVector @ E @ VectorConvertor @@ SAXAEAV? $ vector @ EV? $ allocator @ E @ std @@@ std @@ 0 @ Z), на которые ссылается функция «public: staticclass std :: vector> __cdecl Utf8 :: WStringToUtf8 (класс std :: basic_string, class std :: allocator>) "(? WStringToUtf8 @ Utf8 @@ SA? AV? $ vector @ EV? $ allocator @ E @ std @@@ std @@ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V? $ распределитель @ _W @ 2 @@ 3 @@ Z)


Когда я не использую этот метод в своем коде Я не получаю сообщений об ошибках. Что я делаю неправильно, когда звоню? Я что-то упускаю?


Я использую Visual Studio 2010 Express Edition.

+1

не полезно, но эти сообщения об ошибках были просто реалом на почему я прекратил кодирование с C++. – 2010-11-24 19:30:20

+0

Для наглядности не путайте `template method` (который является шаблоном проектирования) с` функцией шаблона-шаблона `и` function template`. – 2010-11-24 19:39:15

ответ

5

Вам нужно поместить тело функции в файл заголовка. См. this FAQ.

2

Шаблон сшивание может получить сложно. Но самое простое решение обычно:

Поместите все определения шаблонов в заголовочные файлы.

В этом случае вы должны перемещать содержимое VectorConverter.cpp в VectorConverter.h (или, возможно, #include "VectorConverter.cpp" в нижней части VectorConverter.h).

0

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

0

Ошибки связаны с попыткой написать определение метода шаблона в файле CPP. Чтобы сократить время связывания, правилом является написать реализацию (определение) встроенных и шаблонных методов в файле заголовка. Код ниже - это правильный способ объявления и определения метода шаблона.

VectorConvertor.h

class VectorConvertor 
{ 
    public: 
     template <class T> 
     static void AppendToVector1(  std::vector<T> & VectorToBeAppended, 
            const std::vector<T> & VectorToAppend); 

     template <class T> 
     static void AppendToVector2(  std::vector<T> & VectorToBeAppended, 
            const std::vector<T> & VectorToAppend); 

     template <class T> 
     static void AppendToVector3(  std::vector<T> & VectorToBeAppended, 
            const std::vector<T> & VectorToAppend); 


} 

template <class T> 
void VectorConvertor::AppendToVector1(   std::vector<T> & VectorToBeAppended, 
             const std::vector<T> & VectorToAppend) 
{ 
    VectorToBeAppended.reserve(VectorToBeAppended.size() + VectorToAppend.size()); 
    for (std::vector<T>::size_type i=0; i<VectorToAppend.size(); i++) 
    { 
     VectorToBeAppended.push_back(VectorToAppend[i]); 
    } 
} 

template <class T> 
void VectorConvertor::AppendToVector2(   std::vector<T> & VectorToBeAppended, 
             const std::vector<T> & VectorToAppend) 
{ 
    VectorToBeAppended.reserve(VectorToBeAppended.size() + VectorToAppend.size()); 
    for (std::vector<T>::const_iterator cit=VectorToAppend.cbegin(); cit!=VectorToAppend.cend(); ++cit) 
    { 
     VectorToBeAppended.push_back(*cit); 
    } 
} 

template <class T> 
void VectorConvertor::AppendToVector3(   std::vector<T> & VectorToBeAppended, 
             const std::vector<T> & VectorToAppend) 
{ 
    VectorToBeAppended.insert(VectorToBeAppended.end(), VectorToAppend.cbegin(), VectorToAppend.cend()); 
} 

VectorConvertor.cpp

// Nothing to write in the CPP file. 

И это, как использовать его в коде:

std::vector<uint8_t> InputData, OutputData; 
// ... 
VectorConvertor::AppendToVector3(OutputData, InputData); 
Смежные вопросы