gpt4 book ai didi

c++ - 模板偏特化问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:18:52 26 4
gpt4 key购买 nike

我正在尝试为数学编程编写一个大小和类型通用 vector 类。我在部分特化方面遇到问题。

当我尝试针对给定大小特化我的 vector 类的成员方法时出现问题。

我可以举一个简单的例子:

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);
}

当尝试编译这个简单示例时,我收到一个编译错误,指出“交叉”特化与现有声明不匹配:

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

我在这里错过了什么?谢谢,佛罗伦萨

最佳答案

实现此目的的一种方法是将 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
}
};

关于c++ - 模板偏特化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13491964/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com