Шаблонная специализация одного метода из шаблонного класса
всегда учитывая, что следующий заголовок, содержащий мой шаблонный класс, включен по крайней мере в два .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).
спасибо!
4 ответов:
Как и в случае с простыми функциями, вы можете использовать объявление и реализацию. Поместите в свой заголовок объявление:
template <> void TClass<int>::doSomething(std::vector<int> * v);и поместите реализацию в один из ваших cpp-файлов:
template <> void TClass<int>::doSomething(std::vector<int> * v) { // Do somtehing with a vector of int's }Не забудьте удалить inline (я забыл и думал, что это решение не будет работать :) ). Проверено на VC++2005
вам нужно переместить определение специализации в файл CPP. Специализация функции-члена класса template допускается даже в том случае, если функция не объявлена шаблоном.
Если вы хотите удалить встроенный по какой-либо причине решение maxim1000 является совершенно допустимым.
в вашем комментарии, однако, кажется, вы считаете, что ключевое слово inline означает, что функция со всем его содержимым всегда вставляется, но AFAIK, который на самом деле очень сильно зависит от оптимизации вашего компилятора.
слово C++ FAQ
есть несколько способов обозначить, что функция является встроенной, некоторые из них которые включают ключевое слово inline, другие нет. Независимо от того, как вы назначьте функцию как встроенную, это запрос, который компилятор разрешено игнорировать: компилятор может встроить-развернуть некоторые, все или нет из мест, где вы вызываете функцию как inline места. (Не надо расстраивайтесь, если это кажется безнадежно расплывчатым. Гибкость системы выше на самом деле огромное преимущество: это позволяет компилятору обрабатывать большие функции отличаются от небольших, плюс это позволяет компилятору создание кода, который легко отлаживается при выборе правильного компилятора опции.)
Итак, если вы не знаете, что эта функция фактически раздует ваш исполняемый файл или если вы не хотите удалить его из заголовка определения шаблона по другим причинам, вы можете оставить его там, где он есть, без какого-либо вреда
Comments