What are the differences between using
typedef Some::Nested::Namespace::TypeName TypeName;
or
using Some::Nested::Namespace
They have different origins and different uses.
typedef comes from C: recall that the C way to declare a struct is:
typedef struct _MyStruct { .... } MyStruct;
It allows you to introduce an alias for a type only. It can be used for the type of a function, with an awkward syntax...
typedef void (*Func)(Foo, Bar);
Where Func is now a pointer to a function taking two arguments by copy (of types Foo and Bar respectively) and returning nothing.
using has, originally, a different meaning. It is meant to inject a name into a scope. Any name (nearly) can be injected: types, functions, variables (but not enum values...)
With C++11, the syntax has been enhanced to allow template aliasing:
template <typename T>
using equiv_map = std::map<T,T>;
This powered-up using means that aliasing (see below) is now possible, on top of the previous functionalities.
This C++11 change is a clear direction toward syntax harmonization. Note how the definition of an alias is now similar to the definition of a variable:
<name> = <expression>;
Unfortunately it seems the Standard reserved this aliasing to template situations, so for now both typedef and using coexist, each with its own hunting ground.
Using just brings declaration into the local scope, while typedef introduces a typedef-name. One difference between them is elaborated type specifiers, e.g.:
namespace n
{
class foo
{
};
}
typedef n::foo n_foo;
using n::foo;
int main()
{
class foo f1; // ok, declares f1 variable of type n::foo.
class n_foo f2; // error, typedef-name can't be used in elaborated-type-specifier.
}
typedef gives an alias name for the type.
typedef Some::Nested::Namespace::TypeName TypeName;
Once you do that, You can refer Some::Nested::Namespace::TypeName just by saying TypeName in the local namespace.
using declaration makes the type visible in the current namespace.
using Some::Nested::Namespace::TypeName;
Imports the type in the current namespace.
In this case, using the either of the above you can refer Some::Nested::Namespace::TypeName by just using TypeName in the local namespace.