2016-01-09 3 views
0

Я написал шаблон для очень простой функции печати, и я поместил его в библиотеку пользовательских функций, которые имеют дело с консольным IO.Специализированный шаблон функции в отдельном файле .cpp

Я написал вторую библиотеку для конкретного проекта, то есть ребенка оригинала. Он специализируется на одном из шаблонов.

Я столкнулся с ошибкой, которая (я подозреваю) вызвана вызовом main.cpp, произошедшим перед объявлением специализированного шаблона. Ошибка содержит следующую строку:

In instantiation of 'static void baseIO::print(S) [with s = std::vector<int>]' 

что означает его вызов baseIO::print() вместо specialIO::print()

Я попытался сделать specialIO::print() регулярная функцию вместо шаблона, и объявить его как обычно в заголовке, но отрицала основными .cpp доступ к базовому шаблону.

Есть ли способ сделать мою специализацию пригодной для использования в main.cpp БЕЗ, если объявить реализовать ее там?

//in main.cpp 
#include <vector> 
#include "specialIO.h" 

main(){ 
    std::vector<int> myVector; 
    specialIO::print(myVector); 
    specialIO::print("hello world"); 
    return 1; 
} 

.

//in baseIO_templates.cpp - templates are outside of the baseIO.cpp file because of linker errors 
template<typename S>  //primary template 
void baseIO::print(S str){ 
    std::cout << str; 
} 

//baseIO.h 
class baseIO{ 
public: 
    template<typename S> //primary template 
    static void print(S str); 
} 
#include "baseIO_templates.cpp" 

.

//specialIO.cpp 
template<>    //specialized template 
void static specialIO::print(vector<int> myVector){ 
    for(int i : myVector){ 
     baseIO::print(i) 
    } 
} 

//specialIO.h 
class uberIO : public baseIO { 
    //empty 
} 
+0

Любая конкретная причина, почему вы всегда копируете вектор и не передаете его const ref? – axalis

ответ

0

Весь код шаблона должен быть доступен компилятору при вызове кода. Итак, если вы объявили template<T> void SomeFunction(T x); - тогда компилятор должен будет знать определение SomeFunction, когда вы позвоните ему с std::string, или float или MyStruct. Поскольку компилятор не может понять, как найти правильную реализацию (или сгенерировать код для правильной реализации), если он не знал этого типа до сих пор ...

Таким образом, вы не можете разместить шаблон конкретизации в файле .cpp - можно поставить специализацию в файле .cpp, если вы объявите их в заголовке-файла, так:

class specialIO : public baseIO { 
public: 
    template<>void static print<std::vector>(std::vector<int> v); 
}; 

Но если оставить его пустым, то компилятор не будет даже знаю, что есть такая функция печати, поэтому не могу назвать ее - она ​​попытается передать std::vector в обычный baseIO::print<T>, который не будет работать, потому что он не способен это сделать.

+0

Я подозревал, что мне нужно включить что-то в заголовок, но понятия не имел, что. любите тщательность вашего объяснения. Благодаря! – ISaidWutWut

+0

Добавил это в мой код, но теперь я получаю «ошибка: явная специализация в области без пространства имен» classIOIO – ISaidWutWut

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