【发布时间】:2016-07-14 12:51:16
【问题描述】:
我目前正在实现一个数据集帮助器类模板,该模板将浮点值 (Scalar) 存储在一个动态大小的 Eigen::Matrix 中,该模板由不同值类型的向量 (Element) 构成,另外还存储对此输入向量的引用.现在我想部分专门化向量值类型中的构造函数,保留标量类型中的模板以显式实例化。
不幸的是,我在 VS 2010 上遇到“无法将函数定义与现有声明匹配”。代码很简单:
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完全模板并将所需信息复制到通用容器中,并通过重载实现构造函数。
【问题讨论】: