Я пытаюсь определить функцию-член шаблона для класса шаблона вне класса, а также использовать SFINAE для эффективной частичной перегрузки функции. Минимальный пример того, что я пытаюсь сделать:
Тест.ч:
template<typename T, size_t D>
class Test
{
public:
Test(){}
~Test(){}
template<size_t W = D, typename = int*>
void do_something(Test&);
private:
T data[D];
};
#include <type_traits>
template<typename T, size_t D>
template<size_t W, typename std::enable_if<W == 2, int>::type* = 0>
inline void Test<T, D>::do_something(Test &)
{
exit(2);
}
template<typename T, size_t D>
template<size_t W, typename std::enable_if<W == 3, int>::type* = 0>
inline void Test<T, D>::do_something(Test &)
{
exit(3);
}
Основной.cpp:
int main(int, char**) {
Test<float, 2> t1;
Test<float, 2> t2;
t1.do_something(t2);
return 0;
}
Однако этот пример кода выдает ошибку: C2244 'Test::do_something': невозможно сопоставить определение функции с существующим объявлением. Если я изменюсь
template<size_t W, typename std::enable_if<W == 2, int>::type* = 0>
to
template<size_t W, typename Type>
и удалите другое определение do_something, тогда код скомпилируется без проблем, поэтому я знаю, что проблема в enable_if. Итак, вопрос: как использовать enable_if для достижения эффекта частичной перегрузки без определения функции внутри класса?
Должен добавить, что я компилирую с помощью MSVS 2015.
std::enable_if
также в объявлении. - person Jarod42   schedule 15.07.2016