Используйте enable_if для функции-члена класса с отдельным определением - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь реализовать шаблон двоичного дерева класса (для обучения).

У меня есть следующее определение:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...