是什么导致了这个张量外积中的无限模板递归
What causes infinite template recursion in this tensor outer product?
我正在使用张量的模板化表示来实现外部产品。
张量的基本原型如下所示:
template <int N>
struct Tensor
{
Tensor<N - 1> x;
Tensor<N - 1> y;
Tensor<N - 1> z;
};
具有专门化,Tensor<1>
退化为简单向量。我的Outer
函数定义为:
template <int N, int M>
Tensor<N + M> Outer(const Tensor<N> &lhs, const Tensor<M> &rhs)
{
Tensor<N + M> result;
result.x = Outer(lhs.x, rhs);
result.y = Outer(lhs.y, rhs);
result.z = Outer(lhs.z, rhs);
return result;
}
template <int N>
Tensor<N + 1> Outer(const Tensor<N> &lhs, const Tensor<1> &rhs)
{
Tensor<N + 1> result;
result.x = Outer(lhs.x, rhs);
result.y = Outer(lhs.y, rhs);
result.z = Outer(lhs.z, rhs);
return result;
}
template <>
Tensor<2> Outer(const Tensor<1> &lhs, const Tensor<1> &rhs)
{
Tensor<2> result;
result.x.x = lhs.x * rhs.x;
result.x.y = lhs.x * rhs.y;
result.x.z = lhs.x * rhs.z;
// and so on
return result;
}
N
阶张量A
张量和M
阶张量B
的外积只是每个A
元素与B
张量的外积。任何阶张量N
与 1
阶张量的外积定义类似。
基本情况只是两个1
阶张量(向量)的外积。除了,如上所述,我在 MSVC 中收到C1202
错误:
错误 C1202:递归类型或函数依赖项上下文过于复杂
我在对外产品的定义中做错了什么?
这
对我来说很干净:
template<int N>
struct Tensor
{
Tensor<N - 1> x;
Tensor<N - 1> y;
Tensor<N - 1> z;
Tensor() { }
Tensor(const Tensor<N-1>& X, const Tensor<N-1>& Y, const Tensor<N-1>& Z)
: x(X), y(Y), z(Z)
{ }
};
template<>
struct Tensor<1>
{
double x;
double y;
double z;
Tensor() : x(), y(), z() { }
Tensor(double x, double y, double z) : x(x), y(y), z(z)
{ }
};
template<int N, int M>
Tensor<N + M> Outer(const Tensor<N>& lhs, const Tensor<M>& rhs)
{
Tensor<N + M> result;
result.x = Outer(lhs.x, rhs);
result.y = Outer(lhs.y, rhs);
result.z = Outer(lhs.z, rhs);
return result;
}
template<int N>
Tensor<N + 1> Outer(const Tensor<N>& lhs, const Tensor<1>& rhs)
{
Tensor<N + 1> result;
result.x = Outer(lhs.x, rhs);
result.y = Outer(lhs.y, rhs);
result.z = Outer(lhs.z, rhs);
return result;
}
template<int N>
Tensor<N + 1> Outer(const Tensor<1>& lhs, const Tensor<N>& rhs)
{
return Outer(rhs, lhs);
}
Tensor<2> Outer(const Tensor<1>& lhs, const Tensor<1>& rhs)
{
Tensor<2> result;
result.x.x = lhs.x * rhs.x;
result.x.y = lhs.x * rhs.y;
result.x.z = lhs.x * rhs.z;
result.y.x = lhs.y * rhs.x;
result.y.y = lhs.y * rhs.y;
result.y.z = lhs.y * rhs.z;
result.z.x = lhs.z * rhs.x;
result.z.y = lhs.z * rhs.y;
result.z.z = lhs.z * rhs.z;
return result;
}
int main()
{
Tensor<4> a;
Tensor<4> b;
Outer(a, b);
}
值得注意的变化是:
Tensor<1>
专用化需要在任何Outer
重载之前定义。Tensor<1>
专用化需要默认构造,因为Tensor<2>
将尝试默认构造其x
、y
和z
数据成员。template<int N> Tensor<N + 1> Outer(const Tensor<1> &lhs, const Tensor<N> &rhs)
重载需要与template<int N> Tensor<N + 1> Outer(const Tensor<N> &lhs, const Tensor<1> &rhs)
对称,或者你需要添加一个需要double
的重载来lhs
。- 从
Tensor<2> Outer(const Tensor<1> &lhs, const Tensor<1> &rhs)
重载中删除template<>
- 我们在这里重载,而不是专门化。
相关文章:
- 交换运算符 + 重载会导致无限递归
- 为什么当函数参数未定义为常量引用时存在无限递归?
- 为什么这是无限递归
- 尝试"复制"shared_ptr向上转换行为会导致复制构造函数上的无限递归(导致段错误)
- ConstexPR模板功能的无限递归
- 交换和移动无限递归
- 无限循环与无限递归.两者都未定义吗?
- 函数中的无限递归
- 运算符重载流提取运算符 (>>) C++会导致无限递归流提取
- C :Ostream无限递归
- 无限递归模板实例化使用clang时GCC工作正常
- 当我使用 boost 构建绝对路径时,无限递归
- 模板中的无限递归
- C++中的无限递归快速排序
- 尽管有停止条件,无限递归调用仍会执行,因为参数不会前进
- 在映射中插入地址时,新运算符重载会导致无限递归
- 可变参数模板实例化中的无限递归,试图构建任意深度的树状结构
- 调用原始版本的DLL挂钩函数时,我得到了无限递归
- std::swap 在 VS 2013 中导致无限递归
- 卡在无限递归中