this post was submitted on 30 Mar 2024
7 points (100.0% liked)
C & C++
889 readers
3 users here now
founded 5 years ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
view the rest of the comments
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_something
outside 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_something
declaration related to incomplete type (presumably because of thet.private_msg
usage):My reasoning is that removing the
t.private_msg
from 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
Foo
is complete: