Can a class share a namespace's name?

19,977

Solution 1

You cannot have the arrangement you have in your question because there is no way to disambiguate Bar.

My compiler says:

error C2757: 'Bar' : a symbol with this name already exists and therefore this name cannot be used as a namespace name

Solution 2

"can there be a namespace with the same name as a class?"

No, If they are in the same namespace, as in your case.

Otherwise, yes. Anything can have the same name as anything else if they are in different namespaces. See this stackoverflow thread as reference.

Solution 3

No, but you can have SomeFunction be a static member of the Bar class.

namespace Foo
{
    class Bar
    {
        // Class code here.
        static void SomeFunction()
        {
            // Function code here.
        }
    };
}

The result is not 100% equivalent to what you want (because of ADL) but the qualified names are what you expect.

Share:
19,977

Related videos on Youtube

Maxpm
Author by

Maxpm

/* No comment. */

Updated on May 31, 2022

Comments

  • Maxpm
    Maxpm about 2 years

    Is the following C++ code valid?

    namespace Foo
    {
        class Bar
        {
            // Class code here.
        };
    }
    

    namespace Foo
    {
        namespace Bar
        {
            void SomeFunction();
            {
                // Function code here.
            }
        }
     }
    

    In other words, can there be a namespace with the same name as a class?

  • Mike Seymour
    Mike Seymour about 13 years
    No, that question is about using the same name in different namespaces.
  • quamrana
    quamrana about 13 years
    @Mike: I think that Ozair has answered the second question of the OP.
  • Ozair Kafray
    Ozair Kafray about 13 years
    @quamrana: Yes, I did answer the second part of the question.
  • Mike Seymour
    Mike Seymour about 13 years
    OK. To clarify this answer: anything can have the same name as anything else if they are in different namespaces; a class cannot have the same name as a namespace if they are both in the same namespace.