2013-02-12 116 views
0

我使用Eigen線性代數包,它們提供矩陣模板化的維度。我想有一些函數生成測試數據,我的計劃,所以我想他們模板的尺寸爲好,並具有特定專業:功能模板專業化(以int值爲模板)

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

如果你想專注函數模板,你不應該重新聲明模板參數(請注意,你不能部分專門的函數模板):

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個的閉合尖括號(>)之間的空間中沒有更多的必要。

1

錯誤的語法:

模板專業化應該是:

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

仍然包含了'K'。 – aschepler 2013-02-12 18:44:09