模板和方法专业化

时间:2018-01-13 06:03:50

标签: c++ templates variadic-templates

我正在自己学习模板,而且我正在非常粗略地想出一些事情。特别是在部分专业化方法或功能方面。

我正在构建一个小型库,用于使用张量进行数学计算(主要是作为学习经验),我认为使用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

的行

我的语法错误怎么办?或者是否有更深层次的东西,我不了解模板及其工作原理?

如果提供解决方案,具有功能而不是方法或操作员是可以接受的,但绝对不是首选。

1 个答案:

答案 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;
    }

或者只是在类中内联定义函数。

相关问题