LINUX.ORG.RU

Обращение к variadic-шаблону из другого файла

 


0

2

Есть у меня в классе метод, определенный с помощью variadic-шаблона. Можно считать, что вот так:

template<typename... Args>
void MyCoolClass::Printf(const std::string &fmt, Args... args)
{
	printf(fmt.c_str(), args...);
}

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

Но при обращении из другого файла, грубо говоря main.cpp:

void main()
{
	MyCoolClass mcc = new MyCoolClass();
	mcc->Printf("Hello %d world!\n", 31337);
}

линкер ругается на то, что не может найти реализацию нужной функции. При этом я прекрасно понимаю компилятор.

Сборочку провожу по отдельным *.o файлам в мейкфайле, если запустить просто g++ *.cpp — все хорошо, как и должно быть.

Есть ли бескостыльный способ сказать компилятору, что нужно сгенерить, и не потерять при этом гибкость модульной сборки?

★★★★★

Вынеси реализацию всей шаблонной магии в заголовочный файл. Это единственный действительно бескостыльный способ.

Gvidon ★★★★
()
Последнее исправление: Gvidon (всего исправлений: 1)

разве линкер не должен распетлять все это, когда ему на вход подадут пачку объектников?

x0r ★★★★★
()

tl;dr Перенеси все шаблоны в хэдеры.

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

Sectoid ★★★★★
()

Нет, экспорта шаблонов в плюсах не существует.

Можно инстанцировать и экспортировать шаблон вручную для конкретных наборов параметров (explicit instantiation), но вряд ли это то, что ты хочешь. Просто помести определение шаблона в хедер, чтобы он был доступен из всех TU.

intelfx ★★★★★
()

Просто выложи в хедер реализацию и наблюдай за разбуханием кода :-)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.