Всегда считая, что следующий заголовок, содержащий мой шаблонный класс, входит, по крайней мере, два .CPP
файлов, этот код компилируется правильно:шаблон специализации одного метода из шаблонного класса
template <class T>
class TClass
{
public:
void doSomething(std::vector<T> * v);
};
template <class T>
void TClass<T>::doSomething(std::vector<T> * v) {
// Do somtehing with a vector of a generic T
}
template <>
inline void TClass<int>::doSomething(std::vector<int> * v) {
// Do somtehing with a vector of int's
}
Но обратите внимание на встроенном в методе специализации. Требуется, чтобы код не имел ошибки компоновщика (в VS2008 есть LNK2005) из-за того, что метод определен более одного раза. Я понимаю это, потому что AFAIK полная спецификация шаблона совпадает с простым определением метода.
Итак, как я могу удалить это inline
? Код не должен дублироваться при каждом его использовании. Я искал Google, прочитал некоторые вопросы здесь, в SO и попробовал многие из предлагаемых решений, но ни один из них не был успешно построен (по крайней мере, не в VS 2008).
Спасибо!
Почему вы хотите удалить встроенную строку? Вы находите это эстетически неприятным? Считаете ли вы, что это изменяет смысл вашего кода? –
Потому что, если этот метод будет «длинным» и использоваться во многих местах, я бы получил его двоичный код, скопированный везде, не так ли? Я попытался объяснить это в вопросе, но я думаю, что это было неясно ... :) – Chuim
@Martin: Что, если для реализации требуется много другого кода, который затем должен быть включен этим заголовком вместо файла cpp? – sbi