Reputation:
I have the following class hierarchy:
template <typename T>
class base
{
public:
void f() {}
};
class class_a : public base<class_a> {};
class class_b : public base<class_b>,
public class_a
{
using base<class_b>::f;
};
int main()
{
class_b b;
b.f();
return 0;
}
Comeu and Intel C++ v11 claim all is well, however GCC (4.4.1) and VC++ 2008 seem to complain ( http://codepad.org/KQPDsqSp ), eg:
g++ -pedantic -Wall -o test test.cpp
test.cpp: In function ‘int main()’:
test.cpp:5: error: ‘void base<T>::f() [with T = class_b]’ is inaccessible
test.cpp:14: error: within this context
I believe the code is well formed as it is, however I could be wrong, I'm hoping someone from the SO C++ community could provide some insight into this issue.
Note: Adding "public" before the using directive in class_b, resolves the issue for both gcc and VS. Should the accessor section of the class in which the using directive is applied override the derivation mode (public, private) of the base class?
In short is this
Upvotes: 6
Views: 765
Reputation: 57625
What you are doing here, is resolving an ambiguity by importing the symbol into the classes private namespace. Hence it's method shadowing and changing it's visibility to private. You can't have two functions with the exact same prototype both private and public, hence the f is now private.
At least GCC believes that using should be able to change the visibility of a function.
Vague references however found in GCC bug database, show that using in fact shouldn't be affected by scope.
Most importantly, a direct answer (C++ Standard '03 -- 7.3.3/15)
The alias created by the using-declaration has the usual accessibility for a member-declaration.
Hence the answers would be:
Upvotes: 3