3

テンプレート化された関数が別のテンプレート化された関数を継承しているセットアップがあります。

template <typename DataType>
class ClassBase
{ 
  virtual void InitModel(const cv::Mat& data) {};
}

template <typename DataType>
class ClassDerived : public ClassBase<DataType>
{
  void InitModel(const cv::Mat& data) {};
}

ここで、実装ファイルの ClassDerived で InitModel の 2 つの特殊化と 1 つの一般的なテンプレートを実装しようとしています。

template<>
void ClassDerived<float>::InitModel(const cv::Mat& data)
{
 // initialize some things
}

template<>
void ClassDervied<cv::Vec3b>::InitModel(const cv::Mat& data)
{
  // initialize some things
}

template<typename DataType>
void ClassDerived<DataType>::InitModel(const cv::Mat& data)
{
  // initialize some things
}

これを書く前は、専門分野がなく、うまく機能していました。特殊化を追加するとすぐに、仕様関数の再宣言があったというエラーが表示されます。奇妙な部分は、再宣言が同じ行番号を指していることです。同じファイルにあります。特殊化する前は問題なく動作していたので、ファイルが 2 回読み込まれることはないと思います。

では、特殊化が追加されるとすぐにこのようなエラーがポップアップし始めるのはなぜですか?

エラーは次のとおりです。

/other/workspace/perception/perception_kit/object_detection/include/perception_kit/object_detection/grimson_GMM_templated_impl.tpp:129: 複数定義の `perception_kit::GrimsonGMMGen::InitModel(cv::Mat const&)' CMakeFiles/test_obj.dir/src/ object_detection_templated_test_platform.cpp.o:/other/workspace/perception/perception_kit/object_detection/include/perception_kit/object_detection/grimson_GMM_templated_impl.tpp:129: 最初にここで定義

テンプレート化されたクラスまたは何か他のものを派生させようとしているために問題がありますか?

一部の人にとっては些細な問題かもしれないことは理解していますが、ここに投稿する前にかなりの時間を費やしました.

基本クラスは BaseClass.h にあります (抽象クラスとして実装されています) 派生クラスの宣言は DerivedClass.h にあります 派生クラスの宣言は DerivedClass.tpp にあり、DerivedClass.h に含まれています

4

2 に答える 2

2

基本テンプレート コードは既にヘッダーにインラインで定義されているため (本文は空)、後で再定義することはできません。専門分野ではなく、それがあなたの問題の原因だと思います。

于 2013-04-10T21:08:18.683 に答える