Going to be a bit didactic here...
There are two aspects to accessors:
- Working within the syntax of the language
- Communicating intent
There's also a third aspect that is often ignored, and that is to do with handling change gracefully. My article you link to addresses this last point, but doesn't tell you anything about the other two.
To try to handle change within the syntax of the language you're using is mostly a technical issue, one which is amenable to a few tips thrown together on a web page with a bit of code to back it up.
The hardest aspect is communicating intent and the way to do that is to stick with the idioms of the language. Unfortunately in C++ the syntax gets in the way of this somewhat so we have things like .size() on collections and .first and .second on pairs. They're all accessors, but the syntax changes depending on the implementation -- ouch.
Now, eJames talks about public members breaking encapsulation. Whether a member is public or not has nothing to do with encapsulation. Encapsulation is a product of the design of the objects and of the controls available to the class designer within the language they're using. This is something I explored in a bit more depth in "Encapsulation is a Good Thing™" (this site won't let me add a link yet, but I guess it isn't too hard to Google).
What this leaves us with is that in C++ a derived attribute must use method invocation syntax. A non-derived field doesn't have to, but may choose to if you so wish. If you do use method invocation syntax then you have to write the wrapper method yourself. Not difficult, but it certainly adds to the line count. What I tried to show was a way to use the C++ template language to abstract out the accessor code. It's not totally successful, but it does handle many use cases.
As for whether we should use accessors or not, the problem is that C++ syntax forces the distinction between plain member access and method access upon us as developers. This is annoying, but we do have some tools to do something about it.
As a library developer I've found that always using method invocation syntax helps me to build more robust APIs because if I find that I want to replace a plain member with something more complex then it gives me more options that don't require quite so much syntax. Remember, I could abstract the other way and make a "function" look like a value by suitable use of cast operators and assigment operators -- actualy maybe I'll try that out and see how I feel about it :)