开发者

C++ Compiler error with CRTP

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

  • A 开发者_开发百科compiler error - if so which compiler GCC,VS or Comeu,Intel
  • Is the above code well formed?
  • Does the accessor section in which a using directive is called override the derivation mode of the base?


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:

  • it's a bug in Comeau
  • no, the code is not well formed, at least C++03-wise (can't find anything related in C++0x N3000)
  • yes, you can change access scope
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜