Coder Social home page Coder Social logo

Comments (10)

TBBle avatar TBBle commented on July 17, 2024

Looks like we've stumbled over FAQ: Why do I get linker errors when I use template friends?.

from sg14.

TBBle avatar TBBle commented on July 17, 2024

However, I believe the suggested resolution causes every operator+= instantiation to be friends with every ring_iterator instantiation, even if the template arguments don't match. We probably want to use the more-verbose solution from Making New Friends idiom page. (i.e. pre-declare template operator+= and friend it using template type deduction).

from sg14.

TBBle avatar TBBle commented on July 17, 2024

Also, already logged as #77 but never apparently acted upon.

from sg14.

martinmoene avatar martinmoene commented on July 17, 2024

Yeah that's the one.

The compile-time (as opposed to link-time) error message (for my incantation of ring_span) with GNU 5.2 was:

prompt>g++ -std=c++17 -O2 -Wall -Wextra -Wno-unused-parameter -o ring-span-lite.t.exe -I../include/nonstd ring-span-lite.t.cpp ring-span.t.cpp   && ring-span-lite.t.exe
In file included from ring-span-lite.t.hpp:12:0,
                 from ring-span-lite.t.cpp:7:
../include/nonstd/ring_span.hpp:518:46: warning: friend declaration 'nonstd::ring_iterator< <template-parameter-1-1>, <anonymous> >::type& nonstd::operator+=(nonstd::ring_iterator< <template-parameter-1-1>, <anonymous> >::type&, int)' declares a non-template function [-Wnon-template-friend]
     friend type& operator+=(type& it, int i) noexcept;
                                              ^
../include/nonstd/ring_span.hpp:518:46: note: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here)

from sg14.

martinmoene avatar martinmoene commented on July 17, 2024

@TBBle Thanks for your notes.

What are reasons to not declare ring_iterator's member operator+=() and operator-=() non-friend like:

type & operator+=( int i ) noexcept
{
    m_idx += i;
    return *this;
}

and operator+() and operator-() in the sg14 (eventually std) namespace like:

template< class Ring, bool is_const >
ring_iterator<Ring,is_const> operator+( ring_iterator<Ring,is_const> it, int i ) noexcept
{
    it += i;
    return it;
}

from sg14.

TBBle avatar TBBle commented on July 17, 2024

I'd defer that question to the paper editors, @hatcat and @Quuxplusone.

Side-note, I've just confirmed this warning on g++ 6.3.0. I intend under #96 to try and get better test coverage in-place so that things like this can't easily slip past.

from sg14.

TBBle avatar TBBle commented on July 17, 2024

Yeah, the free-function operators should be in the sg14 namespace. Almost certainly an oversight, it breaks the build on VS2017 which can't find them, and hence can't use std::distance and hence std::inner_product from the unit tests.

Edit: Different issue. We're actually missing operator-(ring_iterator<Ring,is_const>,ring_iterator<Ring,is_const>).

from sg14.

TBBle avatar TBBle commented on July 17, 2024

Binary Operators in the Stackoverflow C++ Operator mega-answer agrees with @martinmoene's approach:

For the binary arithmetic operators, do not forget to obey the third basic rule operator overloading: If you provide +, also provide +=, if you provide -, do not omit -=, etc. Andrew Koenig is said to have been the first to observe that the compound assignment operators can be used as a base for their non-compound counterparts. That is, operator + is implemented in terms of +=, - is implemented in terms of -= etc.

According to our rules of thumb, + and its companions should be non-members, while their compound assignment counterparts (+= etc.), changing their left argument, should be a member. Here is the exemplary code for += and +, the other binary arithmetic operators should be implemented in the same way:

from sg14.

TBBle avatar TBBle commented on July 17, 2024

My current hack-tree is https://github.com/TBBle/SG14/tree/SG14-build-fix-hacks, which when merged with #95, gets everything building on the platforms I happen to be testing on (four Windows x64 compilers). I simply took the Make New Friends idiom in order to get it to compile. The above-described approach is better.

from sg14.

Quuxplusone avatar Quuxplusone commented on July 17, 2024

Can this issue be closed as "fixed," at this point?

from sg14.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.