我目前正在實現一個數據集輔助類模板,該模板存儲浮點值(Scalar
),動態調整Eigen::Matrix
不同的值類型(Element
)額外存儲對此輸入向量的引用。現在我想部分地專門化矢量值類型中的構造函數,並保留要顯式實例化的標量類型中的模板。C++,2參數類模板的部分特化:無法將函數定義與現有聲明匹配
不幸的是我得到「無法定義的功能匹配到現有的宣言」於2010年VS的代碼很簡單,只要:
template <class Scalar, class Element> struct DataSet
{
DataSet(std::vector<Element> const & source);
// several generic member functions here ...
Eigen::Matrix<Scalar, ... > data;
std::vector<Element> const & source;
};
template<class Scalar>
DataSet<Scalar, SomeClass>::DataSet(std::vector<SomeClass> const & input)
{
// special impl for Element==SomeClass ...
}
SomeClass的應自動對其進行編譯的時候想通了這樣做的權利,但我嘗試了所有有意義的組合,但仍然得到:
*.cpp(79) C2244 : unable to match function definition to an existing declaration
see declaration of 'DataSet<Scalar, Element>::DataSet'
我是不是能夠通過搜索互聯網還沒有找到一個匹配的例子。提前致謝!
編輯:
爲了使它更具體,在我的現實世界的情況下,我希望能夠定義多個部分特例與不同類型的構造Element
如:
template<Scalar>
DataSet<Scalar, FirstClass>::DataSet(std::vector<FirstClass> const & first)
: data()
, source(first)
{
// special impl here ...
}
template<Scalar>
DataSet<Scalar, std::shared_ptr<SecondClass> >::DataSet(std::vector<std::shared_ptr<SecondClass> > const & second)
: data()
, source(second)
{
// special impl here ...
}
不希望將類完全重新聲明/專門化爲某個類型名稱。那麼根本沒有什麼用處可以成爲一個模板。我想要解決方案,否則可能會有其他策略來解決我的問題。
FIN:
因爲它看起來像不是可以通過僅對專業構造(這是某種相關類的隱含專業化)分享類模板和構造的類型Element
我刪除了完全從類模板中引用source
,並將所需信息複製到通用容器中,並通過重載實現構造函數。
感謝您的幫助,但這不會直接引用源數據,並增加了代碼行,與我最初希望儘可能簡單的想法不同。我現在刪除了對源數據的引用,並將這些信息抽象爲一些通用容器。構造函數現在可以實現爲沒有'Element'的重載。但是我仍然很好奇這個問題出在哪裏,因爲總的來說,開始的方式應該是從句法的角度去做的方式。 – daku
@daku假設專門的模板會從主要的「基礎」中「繼承」成員,這很直觀,但事實並非如此。這是因爲模板參數可能意味着某些成員在某些專業領域完全不適用,從而導致隱含的「繼承」問題。如果是這樣,它必須被決定要求完全重新宣告,並且不應該判斷值得添加大量的神祕語法來指定成員是否應該被「繼承」......當你可以簡單地使用_actual_繼承來確保它們是。但是,我會看看我能否找到正確的記錄理由 –
@underscore_d:這是因爲專業化不是繼承;-)專門化類模板會創建一個完整的新類。我的目標是專門化構造函數,這顯然是不可能的,因爲'Element'是類模板的模板參數。如果我使構造函數成爲模板函數,然後可能不可能在類和函數模板之間共享參數'typename Element'(對於ctor,或者它以某種方式?),應該很容易做到這一點。 – daku