我正在自己学习模板,而且我正在非常粗略地想出一些事情。特别是在部分专业化方法或功能方面。
我正在构建一个小型库,用于使用张量进行数学计算(主要是作为学习经验),我认为使用Tensor数据结构的模板将是最好的调用,所以我开始了解它们及其用法;这就是我(有一些帮助)提出的:
template<typename T, std::size_t...>
class Tensor;
template<typename T, std::size_t N>
class Tensor<T, N>{
T data[N];
};
template<typename T, std::size_t N, std::size_t M>
class Tensor<T, N, M>{
using dataType = Tensor<T, M>;
dataType data[N];
};
template<typename T, std::size_t N, std::size_t... Ms>
class Tensor<T, N, Ms...>{
using dataType = Tensor<T, Ms...>;
dataType data[N];
};
现在我想向Tensor<T,N,M>
添加一个可用于与其他模板化类一起操作的运算符。所以,我把它添加到我的类定义中(我希望P从传递给方法的参数中推导出来):
template<std::size_t P>
Tensor<T,N,P> operator*(Tensor<T,M,P> other);
当我想实现它时,我这样做:
template<typename T, std::size_t N, std::size_t M, std::size_t P>
Tensor<T,N,P> Tensor<T,N,M>::operator*(Tensor<T,M,P> other){
Tensor<T,N,P> result;
// do other stuff
return result;
}
这会引发以下编译时错误:
invalid use of incomplete type 'class MesTen::Tensor<T, N, M>'
---这一行在operator*
的实施开始
error: declaration of 'class MesTen::Tensor<T, N, M>'
---这一行在我宣布空Tensor
类
我的语法错误怎么办?或者是否有更深层次的东西,我不了解模板及其工作原理?
如果提供解决方案,具有功能而不是方法或操作员是可以接受的,但绝对不是首选。
答案 0 :(得分:2)
您无法将模板参数组合到单个列表中,需要“模板模板”:
template<typename T, std::size_t N, std::size_t M>
template<std::size_t P>
Tensor<T,N,P> Tensor<T,N,M>::operator*(Tensor<T,M,P> other){
Tensor<T,N,P> result;
// do other stuff
return result;
}
或者只是在类中内联定义函数。