C++ language
C++ language
Using-declaration
Introduces a name that is defined elsewhere into the declarative region where this using-declaration appears.
- Using-declaration introduces a member of another namespace into current namespace or block scope.
#include <iostream> #include <string> using std::string; int main() { string str = "Example"; using std::cout; cout << str; }
Namespaces
Namespaces provide a method for preventing name conflicts in large projects.Symbols declared inside a namespace block are placed in a named scope that prevents them from being mistaken for identically-named symbols in other scopes.
#include <iostream> using namespace std; namespace X { int x=1; void Check(){ cout << x << endl; //Y::Check(); --> error: Y has not been declared } }// namespace X namespace Y { int y=2; int Check(){ X::Check(); return y; } }// namespace Y using namespace std; namespace Hello { struct Node{ int val; }; }// namespace Hello namespace Other { using namespace Hello; static Node node; void printNodeVal ( struct Node node ){ cout << "Hello" << endl; } }// namespace Other int main() { cout << Y::Check() << endl; return 0; }
Difference between namespace and class in C++
The namespace and classes are two different concepts.
- Classes are datatypes.
- Classes are basically extended version of structures.
- Classes can contain data members and functions as members, but namespaces can contain variables and functions by grouping them into one.
- The namespaces cannot be created as objects.
- This concept is used as additional information to differentiate similar functions, classes, variables etc.
- Variables, functions with same name can be placed in different namespaces.
- The namespaces are used to make a group of identifiers so they do not collide. By using class, we have to create an instance of that class, but for namespaces this is not true.
- For namespace we use ‘using’ declaration. For classes it is not possible unless we are deriving from it.
- We can reopen namespace and add more elements across translation units. This cannot be done using classes.
- build success
For ex.,
namespace my_namespace { int function1(); } namespace my_namespace { int function1(); } namespace A { int f1(); } namespace A { int f2(); }
class my_class { int function1(); }; class my_class { int function1(); }; class A { int f1(); }; class A { // illegal int f2(); };
namespace foo { namespace bar { namespace baz { int qux = 42; } } } namespace fbz = foo::bar::baz;
Template
A template is a C++ entity that defines one of the following:- a family of classes (class template), which may be nested classes
- a family of functions (function template), which may be member functions
- an alias to a family of types (alias template) (since C++11)
- a family of variables (variable template) (since C++14)
- a concept (constraints and concepts) (since C++20)
Class template
Syntax:template < parameter-list > class-declaration
- class-declaration a class declaration. The class name declared becomes a template name.
- parameter-list a non-empty comma-separated list of the template parameters, each of which is either a non-type parameter, a type parameter, a template parameter, or a parameter pack of any of those.
Class template instantiation
A class template by itself is not a type, or an object, or any other entity.The template arguments must be provided so that the compiler can generate an actual class (or function, from a function template).
- Explicit instantiation
template class-key template-name < argument-list > ;class-key: class, struct or union
namespace N { template<class T> class Y // template definition { void mf() {} }; } // template class Y<int>; // error: class template Y not visible in the global namespace using N::Y; // template class Y<int>; // error: explicit instantiation outside // of the namespace of the template template class N::Y<char*>; // OK: explicit instantiation template void N::Y<double>::mf(); // OK: explicit instantiation
template<class T> struct Z // template definition { void f() {} void g(); // never defined }; template struct Z<double>; // explicit instantiation of Z<double> Z<int> a; // implicit instantiation of Z<int> Z<char>* p; // nothing is instantiated here p->f(); // implicit instantiation of Z<char> and Z<char>::f() occurs here. // Z<char>::g() is never needed and never instantiated: // it does not have to be defined template<class T> class X; // declaration, not definition X<char> ch; // error: incomplete type X<char>
Function template
template < parameter-list > function-declaration
留言