У меня такой рабочий код.

#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 «неизвестным»?

1
Nick 22 Окт 2015 в 11:38

3 ответа

Лучший ответ

Это называется явным созданием.

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

2
Stas 22 Окт 2015 в 08:44

TL; DR нельзя .

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

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

Или (что довольно громоздко) явно создать экземпляры всех типов, для которых можно использовать G.

Невозможно явно создать экземпляр шаблона, если невозможно вывести G.

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

1
Marco A. 22 Окт 2015 в 08:52

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

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

1
Petr 22 Окт 2015 в 08:44