CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 6 of 6
  1. #1
    Join Date
    Nov 2006
    Location
    Essen, Germany
    Posts
    1,344

    namespace confusion

    Hi everyone,

    I´ve got some namespace problems I don´t really understand. I´ve got a header and an implementation file where three functions reside.

    test.h
    Code:
    #ifndef TestH
    #define TestH
    
    namespace A {
    namespace B {
    namespace C {
    
    int get_x();
    int get_y();
    int get_z();
    
    };
    };
    };
    #endif
    test.cpp, working version
    Code:
    #include "test.h"
    
    int A::B::C::get_x()
    {
       return 0;
    }
    
    int A::B::C::get_y()
    {
       return get_x() +1;
    }
    
    int A::B::C::get_z()
    {
       return get_y() +2;
    }
    test.cpp version 2, not working.
    Code:
    #include "test.h"
    
    using namespace A::B::C;
    
    int get_x()
    {
       return 0;
    }
    
    int get_y()
    {
       return get_x() +1;
    }
    
    int get_z()
    {
       return get_y() +2;
    }
    Here´s the calling code
    Code:
    #include "test.h"
    
    int main()
    {
       int x = A::B::C::get_x();
       int y = A::B::C::get_y();
       int z = A::B::C::get_y();
    }

    My compiler (Borland C++ Builder 6) yields two error messages:
    (1) ambiguity between A::B::C::get_x() and get_x()
    (2) ambiguity between A::B::C::get_y() and get_y()

    Now I have a couple of questions:

    1) There are no functions get_x() and get_y() in the global namespace, so why is there an ambiguity?
    2) Do I have to fully qualify the function name in my implementation file or does something exists that saves me from the extra typing?
    Last edited by GNiewerth; May 8th, 2008 at 05:52 AM.
    - Guido

  2. #2
    Join Date
    Jul 2002
    Location
    Portsmouth. United Kingdom
    Posts
    2,727

    Re: namespace confusion

    1) There are no functions get_x() and get_y() in the global namespace,
    Yes there are.
    Code:
    int get_x()
    {
       return 0;
    }
    
    int get_y()
    {
       return get_x() +1;
    }
    
    int get_z()
    {
       return get_y() +2;
    }
    Do I have to fully qualify the function name in my implementation file
    Either that or do the following...
    Code:
    namespace A {
    namespace B {
    namespace C {
    
    int get_x()
    {
       return 0;
    }
    
    int get_y()
    {
       return get_x() +1;
    }
    
    int get_z()
    {
       return get_y() +2;
    }
    
    }
    }
    }

  3. #3
    Join Date
    Nov 2006
    Location
    Essen, Germany
    Posts
    1,344

    Re: namespace confusion

    Very useful, thank you. For some reasons I was convinced that the using directive tells the compiler where to put the function code, but it seems I was wrong.
    - Guido

  4. #4
    Join Date
    Jan 2004
    Location
    Düsseldorf, Germany
    Posts
    2,401

    Re: namespace confusion

    Quote Originally Posted by GNiewerth
    Very useful, thank you. For some reasons I was convinced that the using directive tells the compiler where to put the function code, but it seems I was wrong.
    What if you had more than one using directive at the beginning of your code? ;-)
    More computing sins are committed in the name of efficiency (without necessarily achieving it) than for any other single reason - including blind stupidity. --W.A.Wulf

    Premature optimization is the root of all evil --Donald E. Knuth


    Please read Information on posting before posting, especially the info on using [code] tags.

  5. #5
    Join Date
    Apr 1999
    Location
    Altrincham, England
    Posts
    4,470

    Re: namespace confusion

    Think of it this way: it's a using directive, not a defining directive - it works when you want to use a member, but not when you want to define a member.
    Correct is better than fast. Simple is better than complex. Clear is better than cute. Safe is better than insecure.
    --
    Sutter and Alexandrescu, C++ Coding Standards

    Programs must be written for people to read, and only incidentally for machines to execute.

    --
    Harold Abelson and Gerald Jay Sussman

    The cheapest, fastest and most reliable components of a computer system are those that aren't there.
    -- Gordon Bell


  6. #6
    Join Date
    Feb 2005
    Location
    "The Capital"
    Posts
    5,306

    Re: namespace confusion

    You can do something like this though:
    Code:
    //test.h
    namespace A
    {
      namespace B
      {
        namespace C
        {
          void f();
        }
      }
    }
    
    //test.cpp
    namespace ABC = A::B::C;
    void ABC::f(){}
    to save the typing. Hope it works.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured