代码之家  ›  专栏  ›  技术社区  ›  Dacav

C++模板与对象代码实例化

  •  0
  • Dacav  · 技术社区  · 15 年前

    this question .

    据我所知,基于模板的类和函数通常放在头文件中。这是由于管理泛型数据类型的技术问题造成的,这些数据类型的特性在原则上是未知的。一旦知道它们,编译器就可以生成适合所需数据类型的可执行代码。

    在头文件中 something.h ,我们的班级定义如下:

    template <typename T>
    class Something
    {
        public:
            void setElement (T &elem) {
                element = elem;
            }
            T getElement () {
                return element;
            }
        private:
            T element;
    };
    

    下面的类定义将用 什么的。h :

    template <typename T>
    class Something
    {
        public:
            void setElement (T &elem);
            T getElement ();
        private:
            T element;
    };
    

    以下方法将在 something.cpp

    #include "something.h"
    
    template <typename T>
    void Something<T>::setElement (T &elem)
    {
        element = elem;
    }
    
    template <typename T>
    T Something<T>::getElement ()
    {
        return element;
    }
    

    除非我们在里面声明一些特定的类型实例

    dacav@mithril:<tmp>$ g++ something.cpp  -c
    dacav@mithril:<tmp>$ objdump -D something.o 
    
    something.o:     file format elf64-x86-64
    
    
    Disassembly of section .comment:
    
    0000000000000000 <.comment>:
       0:   00 47 43                add    %al,0x43(%rdi)
       3:   43 3a 20                rex.XB cmp    (%r8),%spl
    ...
    ...
      20:   34 2e                   xor    $0x2e,%al
      22:   31 00                   xor    %eax,(%rax)
    dacav@mithril:<tmp>$
    

    As Martin York shows 我们可以强制编译器为某些特定的数据类型生成代码,以便控制哪些类型可以使用,哪些类型不能使用。但如果我们不想受到任何限制呢?

    2 回复  |  直到 9 年前
        1
  •  1
  •   Puppy    15 年前

    简而言之,你吃饱了。该标准确实定义了一个“export”关键字,它应该从一个文件中导出可实例化(即原始表单,而不是特定类型)模板。然而,事实是,几乎没有主要的编译器支持它,并说他们永远不会支持它。因此,它从C++ 0x中被删除。

        2
  •  2
  •   sth    15 年前

    如果您希望能够为任意类型实例化模板,只需将实例化所需的所有内容放在头文件中即可。这意味着将函数体(需要可以实例化)放在头文件中,而不是放在.cpp文件中。

    如果您只想在单独的文件中声明和定义以便更好地组织源代码,可以使用如下方案:

    // Just the declaration
    
    template<typename T>
    class Something {
      void foo();
    };
    
    // include the header file with the definitons
    #include "something.impl.h"
    

    一些东西。真的

    // Put definitions here
    
    template<typename T>
    void Something<T>::foo() {
    }