2015-10-22 5 views
1

У меня есть рабочий код, похожий на этот.Явный экземпляр шаблона C++

#include <iostream> 

struct A{ 
    template<typename T> 
    void foo(T val); 
}; 

template<typename T> void A::foo(T val) 
{ 
    std::cout << val << std::endl; 
} 

// link template "against" int 
template void A::foo(int val); 

// #include header here 

int main(){ 
    A a; 
    a.foo(12); 
} 

Шаблон находится в отдельном файле CPP, но связывающие работы, из-за явного конкретизации:

template void A::foo(int val); 

Тогда я сделал некоторые рефакторинга, и код выглядит следующим образом:

#include <iostream> 

template<typename G> 
struct A{ 
    template<typename T> 
    void foo(T val); 
}; 

template<typename G> 
template<typename T> void A<G>::foo(T val) 
{ 
    std::cout << val << std::endl; 
} 

// link template "against" int - not working 
//template<typename G> 
//template void A<G>::foo(int val); 

int main(){ 
    A<float> a; 
    a.foo(12); 
} 

Как я могу «связать» T = int, но сохранить G «неизвестно»?

ответ

2

Это называется явным экземпляром.

Вы не можете этого сделать, потому что G неизвестен, и это не один тип. Это скорее набор типов.

+0

@ Ник да, синтаксис довольно сложный в таком случае. См. Https://gist.github.com/artemkin/61d919c6da3fa2d63833 – Stas

1

Вы не можете этого сделать. Чтобы на самом деле создать код из шаблона (я думаю, это то, что вы называете ссылкой), компилятор должен знать все параметры шаблона.

Так вы остались со стандартными опциями для шаблона экземпляра: либо явно указать компилятору, что T и будет использоваться G, либо пусть компилятор увидеть полный код элемента шаблона, где вы используете его (то есть, включают код в заголовке).

1

TL; DR вы не можете.

В вашем случае я бы просто указать тип, который вы собираетесь использовать

template void A<float>::foo(int val); 

или (довольно громоздкие) явно экземпляр все типы G могут быть использованы для.

Вы не можете явно создать шаблон, если G не может быть выведен.

Обратите внимание, что ссылка работает не потому, что этот синтаксис является компилятором, а потому, что ваш компилятор создает код, который позже встречается во время ссылки. Подробнее here

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