Удаление неиспользуемых функций будет происходить при связывании , а не при компиляции, где у вас возникла ошибка. MSVC может не знать, кто из всех компилируемых модулей компиляции в конечном итоге вызовет этот метод. Он не может знать, пока компиляция не будет завершена и пока не произойдет связывание. Естественно, разные компиляторы могут быть умнее в этом, но я подозреваю, что это может быть то, что происходит.
Я подозреваю, что ваши конкретные ошибки компилятора звучат так, как будто вы вызваны только объявлением форварда
template<typename C>
struct c_traits;
Вы не полностью указали класс. Вы пробовали что-то простое, как:
template<typename C>
struct c_traits
{
// some default/dummy int type
};
Я подозреваю, что это по крайней мере остановит компилятор от жалоб.
EDIT
это вообще неправильно для класса
шаблоны. Функции-члены класса
шаблоны не должны быть
компилируется (и любые ошибки в их
тела не должны быть
срабатывает), если они не созданы
В этом случае создается экземпляр шаблона в виде:
foo<short>
Компилятор будет относиться к этому как к любому другому классу, чьи методы имеют потенциал для внешней связи. Я не слышал ни одного специального языкового правила, которое бы гласило, что внешняя связь не применяется к шаблонам ...?