Yes, it is probably a weird question, but I tried a lot, and I started to think that maybe is impossible to overload this template function properly:
#include <iterator>
class Foo
{
private:
const int arr[5] = {10, 20, 30, 40, 50};
public:
const int* begin() const { return arr; }
friend auto std::begin<>(const Foo &f) -> decltype(f.begin());
}
It always throw the same error (in GCC 12.2.0):
main.cxx:10:13: error: template-id ‘begin<>’ for ‘const int* std::begin<>(const Foo&)’ does not match any template declaration
I just wanna know if is possible do things like this. Thanks.
4 Comments
southsamurai@sh.itjust.works · 2 pts · 2y
Off topic, but if you're injecting std into friends, they won't be friends long.
ctr1@fl0w.cc · 2 pts · 2y
I think the issue is that
Foois incomplete when you're declaring the friend, so I think it's impossible. I just tried it and g++ ignores the target candidate due to "member access into incomplete type", which makes sense sincestd::beginis already defined and calls.begin(). The closest you can get is to use another friend to exposearrand overloadstd::beginmanually, but that's a bit silly 😅RuikkaaPrus@lemmy.ml · 2 pts · 2y
Apparently it is impossible for this kind of functions to be defined as friends of classes:
After trying different combinations, it seems that I managed to get it working with the condition the whole template are considered friends of the class. I don't know if I should consider it a language problem, but it seems that way, since the template restrictions (in this case) are minor.
Do you think I found an error in the language?
ctr1@fl0w.cc · 2 pts · 2y
Ah, nice idea. I've tried a few different ways of doing this, and I think what you're seeing is a discrepancy in how the compiler handles member access into incomplete types. It seems that, in your examples, the compiler is allowing
-> decltype(f.private_msg)within the class, but I think it's not selectingdo_somethingoutside of it because it usesdecltype(t.private_msg). In my case, I'm not even able to do that within the class.For example, since I'm not able to use
decltype(f.private_msg)inside the class, I'm usingdecltype(private_msg)instead, which causes an error at thedo_somethingdeclaration related to incomplete type (presumably because of thet.private_msgusage):My reasoning is that removing the
t.private_msgfrom the declaration works:The reason your second example works is because the friend template inside the class acts as a template declaration rather than a specialization, which isn't specialized until after
Foois complete: