• 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);
        }
  • 相关阅读:
    TSQL 字符串前加 N 是什么意思
    SQL语句修改字段默认值
    Clustering Technologies On Windows Server 2008 R2
    sql 修改列名及表名
    Capture screenshots on Mac 在Mac下截图
    极限编程(XP,eXtreme Programming)
    zookeeper安装(单机版)
    linux备份用户权限
    Dubbo管控台安装(zookeeper单机版)
    linux查看IP
  • 原文地址:https://www.cnblogs.com/hbt19860104/p/2626615.html
Copyright © 2020-2023  润新知