Искам да специализирам метод от клас X
за типове с плаваща запетая. Следният код се компилира и работи перфектно:
x.hpp:
template <typename T>
class X {
public:
...
T bucket_width(const BucketID index) const;
T bucket_min(const BucketID index) const;
T bucket_max(const BucketID index) const
...
};
x.cpp:
...
template <typename T>
T X<T>::bucket_width(const BucketID index) const {
return bucket_max(index) - bucket_min(index) + 1;
};
template <>
float X<float>::bucket_width(const BucketID index) const {
return bucket_max(index) - bucket_min(index);
};
template <>
double X<double>::bucket_width(const BucketID index) const {
return bucket_max(index) - bucket_min(index);
};
...
Сега, подобно на този отговор промених cpp файла на:
template <typename T>
T X<T>::bucket_width(const BucketID index) const {
return bucket_max(index) - bucket_min(index) + 1;
};
template <typename T>
std::enable_if_t<std::is_floating_point_v<T>, T> X<T>::bucket_width(const BucketID index) const {
return bucket_max(index) - bucket_min(index);
};
За съжаление, това води до следната грешка на компилатора:
.../x.cpp:46:56: error: return type of out-of-line definition of 'X::bucket_width' differs from that in the declaration
std::enable_if_t<std::is_floating_point_v<T>, T> X<T>::bucket_width(const BucketID index) const {
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
Може ли някой да ми обясни какво пропускам?
Благодаря предварително!
Редактиране: Ние изрично инстанцираме шаблонните класове в края на cpp файла, така че да можем да правим шаблонен код в cpp файла.