Comments (10)
Looks like we've stumbled over FAQ: Why do I get linker errors when I use template friends?.
from sg14.
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.
Also, already logged as #77 but never apparently acted upon.
from sg14.
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.
@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.
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.
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.
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.
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.
Can this issue be closed as "fixed," at this point?
from sg14.
Related Issues (20)
- [slot_map] constructors HOT 1
- [inplace_function] benchmark HOT 4
- [slot_map] Can you get a key using an iterator? HOT 5
- [slot_map] R1/R2 criticisms HOT 12
- [inplace_function] Ambiguous overloads. HOT 5
- [inplace_function] Should [](){return 42;} be convertible to inplace_function<void()>? HOT 1
- [inplace_function] make it usable without exceptions HOT 2
- inplace_function doesn't handle arguments with rvalue references well HOT 1
- [inplace function] Problems assigning if my starting point is empty/nullptr HOT 4
- [inplace_function] Const-callability means thread-safety HOT 4
- [inplace_function] Giant Sized Buffers Required for Compilation HOT 5
- volatile inplace_function fails to compile HOT 6
- License is missing on some includes HOT 1
- `sg14::ring_span`: clear () member function gone awol HOT 2
- [inplace_function] Opt-in "safe" default constructed inplace_function HOT 7
- Provide CMake & Conan installation support
- slot_map: custom key causing clang to seg fault. HOT 1
- [inplace_function] usage at shared library boundaries HOT 5
- sg14::span_ring: class template argument deduction
- [inplace_function.h] Copyright holder HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from sg14.