Skip to content

Commit

Permalink
Fixed "friend function template with constraints that depend on outer…
Browse files Browse the repository at this point in the history
… template parameters must be a definition" errors on newer GCC (#13)

Co-authored-by: Samuel Urban <>
  • Loading branch information
Samo1289 authored Nov 12, 2024
1 parent 5207fe9 commit ea5b681
Showing 1 changed file with 54 additions and 18 deletions.
72 changes: 54 additions & 18 deletions include/more_concepts/mock_iterator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,57 +29,93 @@ namespace more_concepts
using iterator_category = IteratorCategory;
using difference_type = std::ptrdiff_t;

auto operator++() -> mock_iterator&;
auto operator++() -> mock_iterator& {
return {};
}

auto operator++(int) -> mock_iterator;
auto operator++(int) -> mock_iterator {
return {};
}

auto operator*() const -> typename mock_iterator::deref_result;
auto operator*() const -> typename mock_iterator::deref_result {
return {};
}

auto operator->() const -> typename mock_iterator::arrow_result
requires std::derived_from<IteratorCategory, std::input_iterator_tag>;
requires std::derived_from<IteratorCategory, std::input_iterator_tag> {
return {};
}

auto operator==(mock_iterator const&) const -> bool
requires std::derived_from<IteratorCategory, std::input_iterator_tag>;
requires std::derived_from<IteratorCategory, std::input_iterator_tag> {
return {};
}

auto operator--() -> mock_iterator&
requires std::derived_from<IteratorCategory, std::bidirectional_iterator_tag>;
requires std::derived_from<IteratorCategory, std::bidirectional_iterator_tag> {
return {};
}

auto operator--(int) -> mock_iterator
requires std::derived_from<IteratorCategory, std::bidirectional_iterator_tag>;
requires std::derived_from<IteratorCategory, std::bidirectional_iterator_tag> {
return {};
}

auto operator+=(difference_type) -> mock_iterator&
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag>;
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag> {
return {};
}

auto operator-=(difference_type) -> mock_iterator&
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag>;
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag> {
return {};
}

auto operator[](difference_type) const -> typename mock_iterator::deref_result
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag>;
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag> {
return {};
}

auto operator+(difference_type) const -> mock_iterator
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag>;
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag> {
return {};
}

template <std::convertible_to<difference_type> D>
friend auto operator+(D const&, mock_iterator const&) -> mock_iterator
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag>;
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag> {
return {};
}

auto operator-(difference_type const&) const -> mock_iterator
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag>;
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag> {
return {};
}

auto operator-(mock_iterator const&) const -> difference_type
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag>;
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag> {
return {};
}

auto operator<(mock_iterator const&) const -> bool
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag>;
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag> {
return {};
}

auto operator>(mock_iterator const&) const -> bool
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag>;
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag> {
return {};
}

auto operator<=(mock_iterator const&) const -> bool
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag>;
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag> {
return {};
}

auto operator>=(mock_iterator const&) const -> bool
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag>;
requires std::derived_from<IteratorCategory, std::random_access_iterator_tag> {
return {};
}
};

template <typename T, typename IteratorCategory>
Expand Down

0 comments on commit ea5b681

Please # to comment.