Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
| Message-ID | <31d52d8d-796a-4b61-8e56-6da52f2136be@googlegroups.com> (permalink) |
|---|---|
| Newsgroups | comp.std.c++ |
| From | Johannes Gerd Becker <johannes.gerd.becker@googlemail.com> |
| Subject | Re: Shouldn't there be a way to exclude member functions out of name lookup explicitly? |
| Organization | unknown |
| References | <820594f6-b670-4dba-8254-26d352489616@googlegroups.com> <5e134e90-067e-4d71-bf40-c4396bfc52f4@googlegroups.com> |
| Date | 2015-08-01 21:09 -0600 |
Of course, defining a helper function outside the class is a workaround (as is first defining a base class, as described in my original post). The point I would like to make, however, is another one. There are workarounds, yet they get the more tedious the more often the problem arises, namely in templated code. (To begin with: templates live mostly in headers, so the helper functions must live in headers as well, and break encapsulation, pollute my namespace or are simply inconvenient as they have to be templates themselves). It seems consensus (more or less) now that non-member functions defined in the same namespace as a class are part of the interface of that class, BECAUSE they will usually be found by ADL. Now the rule that, within a member function of some class, say B, member functions of B take absolute precendence when a name is looked up, has the unwanted effect that some part of the interface of another, completely unrelated class A, namely the nonmember functions that belong to the interface of A, may become unusable from within B. Why can I write using namespace std; auto i = begin (vec); everywhere in my code, yet not within a class that has a member function named begin ()? I tempted to think this should be considered a design mistake. One could think of several approaches to solve that problem: 1.) Introduce a clause like using explicit this; which would locally force explicitly using this-> when you want to access a member. Then I would write using namespace std; using explicit this; auto i = begin (vec); // ADL auto j = this->begin (); // member 2.) Introduce a special qualifier (like, e.g., .::) to indicate that the following name does *not* refer to a member function. Then I could write using namespace std; auto i = .::begin (vec); // ADL auto j = begin (); // member -- [ comp.std.c++ is moderated. To submit articles, try posting with your ] [ newsreader. If that fails, use mailto:std-cpp-submit@vandevoorde.com ] [ --- Please see the FAQ before posting. --- ] [ FAQ: http://www.comeaucomputing.com/csc/faq.html ]
Back to comp.std.c++ | Previous | Next — Previous in thread | Next in thread | Find similar
Shouldn't there be a way to exclude member functions out of name lookup explicitly? Johannes Gerd Becker <johannes.gerd.becker@googlemail.com> - 2015-07-27 11:22 -0600
Shouldn't there be a way to exclude member functions out of name lookup explicitly? Anton Bikineev <ant.bikineev@googlemail.com> - 2015-07-30 11:54 -0600
Re: Shouldn't there be a way to exclude member functions out of name lookup explicitly? Johannes Gerd Becker <johannes.gerd.becker@googlemail.com> - 2015-08-01 21:09 -0600
Re: Shouldn't there be a way to exclude member functions out of name lookup explicitly? Jakob Bohm <jb-usenet@wisemo.com> - 2015-08-12 13:00 -0600
Re: Shouldn't there be a way to exclude member functions out of name lookup explicitly? Johannes Gerd Becker <johannes.gerd.becker@googlemail.com> - 2015-08-16 17:29 -0600
Re: Shouldn't there be a way to exclude member functions out of name lookup explicitly? Jakob Bohm <jb-usenet@wisemo.com> - 2015-08-18 22:35 -0600
Re: Shouldn't there be a way to exclude member functions out of name lookup explicitly? Richard Smith <richard@ex-parrot.com> - 2015-08-20 01:10 -0600
Re: Shouldn't there be a way to exclude member functions out of name lookup explicitly? Johannes Gerd Becker <johannes.gerd.becker@googlemail.com> - 2015-08-21 19:14 -0600
csiph-web