我正在尝试编写一个大小并输入用于数学编程的通用向量类。我在部分专业化方面遇到了问题。
当我尝试将给定大小的矢量类的成员方法专门化时,会出现问题。
我可以提供一个简单的例子:
template <size_t Size, typename Type>
class TestVector
{
public:
inline TestVector (){}
TestVector cross (TestVector const& other) const;
};
template < typename Type >
inline TestVector< 3, Type > TestVector< 3, Type >::cross (TestVector< 3, Type > const& other) const
{
return TestVector< 3, Type >();
}
void test ()
{
TestVector< 3, double > vec0;
TestVector< 3, double > vec1;
vec0.cross(vec1);
}
当尝试编译这个简单的例子时,我得到一个编译错误,指出'cross'特化与现有声明不匹配:
error C2244: 'TestVector<Size,Type>::cross' : unable to match function definition to an existing declaration
see declaration of 'TestVector<Size,Type>::cross'
definition
'TestVector<3,Type> TestVector<3,Type>::cross(const TestVector<3,Type> &) const'
existing declarations
'TestVector<Size,Type> TestVector<Size,Type>::cross(const TestVector<Size,Type> &) const'
我试图将cross声明为模板:
template <size_t Size, typename Type>
class TestVector
{
public:
inline TestVector (){}
template < class OtherVec >
TestVector cross (OtherVec const& other) const;
};
template < typename Type >
TestVector< 3, Type > TestVector< 3, Type >::cross< TestVector< 3, Type > > (TestVector< 3, Type > const& other) const
{
return TestVector< 3, Type >();
}
此版本通过编译但在链接时失败:
unresolved external symbol "public: class TestVector<3,double> __thiscall TestVector<3,double>::cross<class TestVector<3,double> >(class TestVector<3,double> const &)const
我在这里缺少什么? 谢谢, Florent的
答案 0 :(得分:1)
执行此操作的一种方法是将cross
定义为“仿函数”(即具有operator()
的类)。
template<size_t S, typename T>
class Vec {
// ... stuff
friend struct Cross<S, T>;
Vec<S, T> cross(const Vec<S, T>& other) {
return Cross<S, T>()(*this, other);
}
// ... more stuff
};
template<size_t S, typename T> struct Cross {
Vec<S, T> operator() (const Vec<S, T>& a, const Vec<S, T>& b) {
// general definition
}
};
// Partial specialization
template<typename T> struct Cross<3, T> {
vec<3, T> operator() (const Vec<3, T>& a, const Vec<3, T>& b) {
// specialize definition
}
};
答案 1 :(得分:0)
您不能部分专门化方法。你可以在某些条件下超载。在这里,你可以对你的班级进行部分专业化
template <size_t Size, typename Type> class TestVector
{
public:
inline TestVector (){}
TestVector cross (TestVector const& other) const;
};
定义一般行为:
TestVector<size_t Size, typename Type>::cross (TestVector const& other) const {
// general
}
和一个专门的模板,使您能够为案例int定义特定的行为是3
template <typename Type> class TestVector<3, Type>
{
public:
inline TestVector (){}
TestVector cross (TestVector const& other) const;
};
定义自定义行为:
TestVector<typename Type>::cross (TestVector const& other) const {
// custom
}