我想将模板类拆分为2个文件,例如普通类如何在声明所在的.hpp和实现所在的.ipp中运行。
我使用普通方法。但是使用本身就是模板的方法,我遇到了一些问题。
使用以下结构:
#ifndef MATRIX_HPP
#define MATRIX_HPP
#include <array>
#include <type_traits>
template<typename t,
std::size_t m,
std::size_t n>
class Matrix
{
static_assert(std::is_arithmetic<t>::value,
"Matrix can only be declared with a type where std::is_arithmetic is true.");
public:
Matrix();
template<std::size_t y, std::size_t x, std::size_t p, std::size_t q>
Matrix<t, p, q> slice() const;
private:
std::array<std::array<t, n>, m> data{};
};
#include "Matrix.ipp"
#endif
Matrix.ipp:
#include "Matrix.hpp"
template<typename t, std::size_t m, std::size_t n>
Matrix<t, m, n>::Matrix()
{}
template<typename t,
std::size_t m,
std::size_t n,
std::size_t y,
std::size_t x,
std::size_t p,
std::size_t q>
Matrix<t, p, q> Matrix<t, m, n>::slice() const
{
auto mat = Matrix<t, p, q>();
for (std::size_t i = y; i < m; i++)
{
for (std::size_t j = x; j < n; j++)
{
mat[i - y][j - x] = (*this)[i][j];
}
}
return mat;
}
的main.cpp
#include "Matrix.hpp"
int main() {
auto m = Matrix<3, 3, int>();
auto sliced = m.template slice<1, 1, 2, 2>();
return 0;
}
现在,当我编译它时,它失败并显示以下消息:
../Matrix.ipp:14:17: error: prototype for ‘Matrix<t, p, q> Matrix<t, m, n>::slice() const’ does not match any in class ‘Matrix<t, m, n>’
Matrix<t, p, q> Matrix<t, m, n>::slice() const
^~~~~~~~~~~~~~~
In file included from ../main.cpp:0:0:
../Matrix.hpp:20:18: error: candidate is: template<class t, long unsigned int m, long unsigned int n> template<long unsigned int y, long unsigned int x, long unsigned int p, long unsigned int q> Matrix<t, p, q> Matrix<t, m, n>::slice() const
Matrix<t, p, q> slice() const;
我不知道如何处理这个问题,因为编译器无法识别它。有办法解决这个问题吗?
我希望有人可以帮助我。谢谢!
答案 0 :(得分:0)
您需要定义两组模板参数:一组用于矩阵类模板,另一组用于矩阵类函数,而不是将它们合并为一个长列表:
template<typename t, std::size_t m, std::size_t n>
template<std::size_t y, std::size_t x, std::size_t p, std::size_t q>
Matrix<t, p, q> Matrix<t, m, n>::slice() const
{
另请注意,您的包含实际上已搞砸了。包括&#34; Matrix.hpp&#34; 进入.ipp文件不会起作用,因为你已经包含了#34; Matrix.ipp&#34;来自&#34; Matrix.hpp&#34;。虽然这不会导致错误。