1

私はEigen線形代数パッケージを使用しています。このパッケージでは、次元にテンプレート化された行列が提供されます。プログラムのテストデータを生成するいくつかの関数が欲しいので、ディメンションでもそれらをテンプレート化しようとしています。特定の専門分野があります。

template <size_t K>
boost::shared_ptr<std::vector<DistParams<K> > > sampleDistParams()
{
throw "not implemented";
}

template <size_t K>
boost::shared_ptr<std::vector<DistParams<K> > > sampleDistParams<1>()
{
boost::shared_ptr<std::vector<DistParams<K> > > distParams=(new std::vector<DistParams<K> >());
distParams->push_back(DistParams<K>(asMatrix(0.05), asMatrix(0.1)));
distParams->push_back(DistParams<K>(asMatrix(-0.1), asMatrix(0.2)));
return distParams;
}

template <size_t K>
boost::shared_ptr<std::vector<DistParams<K> > > sampleDistParams<2>()
{
boost::shared_ptr<std::vector<DistParams<K> > > distParams=(new std::vector<DistParams<K> >());
Eigen::Vector2d highMu;
lowMu << 0.04 << 0.06;
Eigen::Matrix2d lowSigma;
highSigma << 0.1 << 0.4
          << 0.4 << 0.12;

    Eigen::Vector2d lowMu;
lowMu << -0.08 << -0.12;
Eigen::Matrix2d highSigma;
highSigma << 0.2 << 0.7
          << 0.7 << 0.24;

distParams->push_back(DistParams<K>(highMu, lowSigma));
distParams->push_back(DistParams<K>(lowMu, highSigma));
return distParams;
}

ただし、このようなものはコンパイルされません。私は得る:

/home/ga1009/PhD/cpp/pmi/cpp/test/baumiterationtest.cpp:24:73: error: template-id ‘sampleDistParams<1>’ in declaration of primary template
/home/ga1009/PhD/cpp/pmi/cpp/test/baumiterationtest.cpp:24:53: error: redefinition of ‘template<unsigned int K> boost::shared_ptr<std::vector<DistParams<K> > > {anonymous}::sampleDistParams()’
/home/ga1009/PhD/cpp/pmi/cpp/test/baumiterationtest.cpp:18:53: error: ‘template<unsigned int K> boost::shared_ptr<std::vector<DistParams<K> > > {anonymous}::sampleDistParams()’ previously declared here
/home/ga1009/PhD/cpp/pmi/cpp/test/baumiterationtest.cpp:33:73: error: template-id ‘sampleDistParams<2>’ in declaration of primary template
/home/ga1009/PhD/cpp/pmi/cpp/test/baumiterationtest.cpp:33:53: error: redefinition of ‘template<unsigned int K> boost::shared_ptr<std::vector<DistParams<K> > > {anonymous}::sampleDistParams()’
/home/ga1009/PhD/cpp/pmi/cpp/test/baumiterationtest.cpp:18:53: error: ‘template<unsigned int K> boost::shared_ptr<std::vector<DistParams<K> > > {anonymous}::sampleDistParams()’ previously declared here

何がうまくいかなかったのですか、どうすれば修正できますか?

4

2 に答える 2

5

関数テンプレートを特殊化する場合は、テンプレートパラメータを再宣言しないでください(関数テンプレートを部分的に特殊化することはできないことに注意してください)。

template<size_t K> void foo() { } // Primary template

template<size_t K> void foo<1>() { } // ERROR: Redefinition
template<> void foo<1>() { } // OK: Specialization

特定のケースでは、テンプレートの特殊化に適した署名は次のとおりです。

template<>
boost::shared_ptr<std::vector<DistParams<1> > > sampleDistParams<1>()

>また、C ++ 11では、閉じ角かっこ( )の間のスペースは不要であることに注意してください。

于 2013-02-12T18:40:36.793 に答える
1

間違った構文:

テンプレートの特殊化は次のようになります。

template <>
boost::shared_ptr<std::vector<DistParams<K> > > sampleDistParams<1>()
于 2013-02-12T18:40:50.573 に答える