2017-06-15 17 views
0

私はcaffeコードを読んでいて、C++クラスのテンプレートコードをhppとcppファイルに分割しています。たとえば、Net.cppにはテンプレートクラスのNet実装コードが含まれ、Net.hppには定義が含まれています。しかし、テンプレートクラスをhppファイルとcppファイルに分割することは不可能であることを思い出しました.Caffeはどのようにこの作業をしていますか? ありがとうございます。caffeはどのようにテンプレートクラスコードをcppファイルとhppファイルに分割しますか?

+1

関連:https://stackoverflow.com/questions/115703/storing-c-template-function-definitions-in-a-cpp-file – NathanOliver

答えて

0

あなたが指摘したように、template definitions cannot be split up as easily from the declarationsいくつかのフープを飛び越えずに。

一般的なパターンの1つは、異なるファイルに分割することです。人の読者の場合しかし、本質的にそれらは依然としてすべて1つのヘッダーに定義されています。例えば

がfoo.h

#pragma once 
template <typename T> 
void Foo(); // declaration 

#include "Foo.inl" 

Foo.inl.hファイルの最後のものは、実際に.inlファイルの完全な内容を含めることであることを

template <typename T> 
void Foo() 
{ 
    // actual definition 
} 

お知らせ。コンパイラに関する限り、あなたが言及した最初の問題を解決するために、すべてのテンプレート定義がヘッダーに含まれています。しかし、人間の読者には、宣言と定義が分かれています。

0

テンプレートの定義と減速を「通常」分けることはできません。コンパイラがテンプレートをインスタンス化するとき、コンテキストで使用されているメンバーの定義と宣言を正確に知る必要があります。ヘッダーファイルのみをインクルードすると、コンパイラーはテンプレートパラメーターのテンプレートをインスタンス化する方法を知りません。

coryKramerが記述した以外の解決策(.cppファイル内)は、必要なテンプレートパラメータのテンプレートを明示的にインスタンス化したものです。この方法で、テンプレートは既に使用するのが好きです(この時点で、テンプレートの完全な宣言と定義があります)。ただし、テンプレートがそのファイルに完全に定義されていない場合、このプロセスを実行する方法をコンパイラが知らないため、テンプレートに他の値をインスタンス化する必要がある場合、エラーが発生することがあります。

これは、.cppファイルの最後にINSTANTIATE_CLASS(ネット)マクロを使用してcaffeで使用される方法です。

+0

ありがとう、私はちょうどコードを見て、あなたは正しいです。 caffeは、caffe/util/math_functions.cppやmath_functions.hppの関数などの関数テンプレートをどのように扱いますか? – XiongJi

関連する問題