Я пытаюсь реализовать шаблон двоичного дерева класса (для обучения).
У меня есть следующее определение:
template <typename T>
class binary_tree final
{
...
public:
template <typename TParam,
typename = enable_if_t<std::is_constructible<T, remove_reference_t<TParam>>::value>>
void insert(TParam &&data);
};
И я пытаюсь добавить реализацию дляinsert
в нижней части заголовочного файла:
template<typename T>
template <typename TParam,
typename = enable_if_t<std::is_constructible<T, remove_reference_t<TParam>>::value>>
void binary_tree<T>::insert(TParam &&data)
{
binary_tree_ptr &insert_location = data > _data ? _right : _left;
if (!insert_location)
insert_location = binary_tree_ptr(new binary_tree(std::forward<TParam>(data)));
else
insert_location->insert(std::forward<TParam>(data));
}
Это не скомпилируется со следующей ошибкой, указывающей на реализацию:
cannot add a default template argument to the definition of a member of a class template
Если я удаляю typename = ...
из реализации я получаю следующую ошибку:
out-of-line definition of 'insert' does not match any declaration in 'binary_tree<T>'
Удаление typename = ...
из объявления не дает ничего лучшего.
Чего мне не хватает?Есть ли способ сделать это?
Я компилирую с использованием clang 6.