Multiple-File Template Implementation

前端 未结 3 1913
迷失自我
迷失自我 2021-01-23 03:38

With normal functions, the declaration and definition are often separated across multiple files like so:

// Foo.h

namespace Foo
{
    void Bar();
}
3条回答
  •  盖世英雄少女心
    2021-01-23 04:23

    You need to write definitions of templated methods in a .hxx file and include it at the end of your header file (.hh) in which you declare it. The .cc/.cpp is used to define non-templated methods.

    So you'll have one .hh, one .hxx (included at the end of the .hh), and one .cc; so that including your templated class header file will include its definition too.

    Example:

    // list.hh
    #IFNDEF LIST_HH
    # DEFINE LIST_HH
    
    template 
    class List
    {
      void fun1(T a);
    
      void fun2();
    }
    
    # include "list.hxx"
    
    #ENDIF
    
    // list.hxx
    #IFNDEF LIST_HXX
    # DEFINE LIST_HXX
    
    # include "list.hh"
    
    template 
    void List::fun1(T a)
    {
       // ...
    }
    
    #ENDIF
    
    // list.cc
    
    #include "list.hh"
    
    void List::fun2()
    {
       // ...
    }
    
    
    // anywhere.cc
    
    #include "list.hh"
    
    // ...
    

    EDIT

    There are several strategies to compile templates. The most common strategy is the one described above to let every user of the class template instantiate the code.

    But, because the *.hh file includes the *.hxx file, each time a simple declaration of a template is needed, the full implementation comes with it. And if the implementation requires other declarations such as std::string, you force all the client code to parse the string header.

    To avoid instantiations several times (time and space consuming), you can introduce a fourth type of file, *.hcc: files that must be compiled once for each concrete template parameter.

    See Also Compile-Time Dependencies

    EDIT2

    Writing the template definition directly in the header file is called inclusion model. Doing so increases the cost of including the header. Not only because we added the definition of the template but because we included headers (, , whatever) which represent thousands of lines. A real problem for significant programs to compile (we are talking about hours of compilation here). The separation model

    Source

    And my last argument: keep clear the header file so that it only contains the class declaration and its documentation. Like that, any other programmer is able to fastly read your header file: what is the public interface of this class, what does the documentation says.

提交回复
热议问题