zoukankan      html  css  js  c++  java
  • qtempinc

        模板必须在使用它的时候才实例化,因此模板不能单独编译。如果把模板声明放在.h文件,把模板函数的定义放在.cpp里。在
    使用到模板的地方,由于只include了头文件,当然就找不到函数定义的代码。因此,简单的办法就是把模板函数的定义和声明都
    放在.h头文件里。
        但是这就出现了一个问题。a.cpp使用了模板,因此就定义了一个该模板类型的实例。如果b.cpp也使用了与a.cpp相同的模板
    实例,则编译器又在b.o定义了一个相同的模板实例。这样在最终的可执行程式或库中有重复的模板实例。
        为了解决这个问题,可以在编译和链接的时候 加上 -qtempinc选项。编译期在遇到这个选项时,会将模板的实例化代码放在
    一个临时目录:tempinc下。后续编译其它文件时,如果使用了相同的模板实例,将不再对它进行实例化。然后,在链接期,再
    将tempinc下的实例化代码写进最终的目标文件。这样就起到防止最终的可执行程式或库中有重复的模板实例的效果。
        当然,使用tempinc需要按一次的步骤:
    1. Declare your class templates and function templates in template header files, with a .h extension.
          2. For each template declaration file, create a template implementation file. This file must have the same file name as the template declaration file and an extension of .c or .t, or the name must be specified in a #pragma implementation directive. For a class template, the implementation file defines the member functions and static data members. For a function template, the implementation file defines the function.
          3. In your source program, specify an #include directive for each template declaration file.
          4. Optionally, to ensure that your code is applicable for both -qtempinc and -qnotempinc compilations, in each template declaration file, conditionally include the corresponding template implementation file if the __TEMPINC__ macro is not defined. (This macro is automatically defined when you use the -qtempinc compilation option.)
    This produces the following results:
    o Whenever you compile with -qnotempinc, the template implementation file is included.
    o Whenever you compile with -qtempinc, the compiler does not include the template implementation file. Instead, the compiler looks for a file with the same name as the template implementation file and extension .c the first time it needs a particular instantiation. If the compiler subsequently needs the same instantiation, it uses the copy stored in the template include directory.
    例子:
    Template declaration file: stack.h
    This header file defines the class template for the class Stack.
    #ifndef STACK_H
    #define STACK_H
    template <class Item, int size> class Stack {
      public:
          void push(Item item);  // Push operator
          Item pop();            // Pop operator
          int isEmpty(){
              return (top==0);   // Returns true if empty, otherwise false
          }
          Stack() { top = 0; }   // Constructor defined inline
      private:
          Item stack[size];      // The stack of items
          int   top;             // Index to top of stack
    };
    #ifndef __TEMPINC__          //  3 
    #include "stack.c"           //  3 
    #endif                       //  3 
    #endif
    Template implementation file: stack.c
    This file provides the implementation of the class template for the class Stack.
    template <class Item, int size>
        void Stack<Item,size>::push(Item item) {
        if (top >= size) throw size;
        stack[top++] = item;
          }
    template <class Item, int size>
        Item Stack<Item,size>::pop() {
        if (top <= 0) throw size;
        Item item = stack[--top];
        return(item);
          }
    Function declaration file: stackops.h
    This header file contains the prototype for the add function, which is used in both stackadd.cpp and stackops.cpp.
    void add(Stack<int, 50>& s);
    Function implementation file: stackops.cpp
    This file provides the implementation of the add function, which is called from the main program.
    #include "stack.h"            //  1 
    #include "stackops.h"         //  2 
    void add(Stack<int, 50>& s) {
      int tot = s.pop() + s.pop();
      s.push(tot);
      return;
        }
    Main program file: stackadd.cpp
    This file creates a Stack object.
    #include <iostream.h>
    #include "stack.h"            //  1 
    #include "stackops.h"         //  2 
    main() {
      Stack<int, 50> s;           // create a stack of ints
      int left=10, right=20;
      int sum;
      s.push(left);               // push 10 on the stack
      s.push(right);              // push 20 on the stack
      add(s);                     // pop the 2 numbers off the stack
                                      // and push the sum onto the stack
      sum = s.pop();              // pop the sum off the stack
      cout << "The sum of: " << left << " and: " << right << " is: " << sum << endl;
      return(0);
        }
  • 相关阅读:
    learning scala view collection
    scala
    learning scala dependency injection
    learning scala implicit class
    learning scala type alise
    learning scala PartialFunction
    learning scala Function Recursive Tail Call
    learning scala Function Composition andThen
    System.Threading.Interlocked.CompareChange使用
    System.Threading.Monitor的使用
  • 原文地址:https://www.cnblogs.com/hbt19860104/p/2626615.html
Copyright © 2011-2022 走看看