在模板类定义下定义内联函数

defining inline functions under template class definition

本文关键字:函数 下定义 定义      更新时间:2023-10-16

我正在尝试在类定义下对模板类 ctor 进行内联定义(我知道您可以在内部执行此操作,但我更喜欢在头文件中进行外部)。但是,MSVC 告诉我,Matrix需要在 ctor 定义中提供一个模板参数列表......我可以通过在类中定义函数来轻松解决此问题(它仍将是内联的),但由于美学原因,我更愿意在外部执行此操作。有没有办法解决这个问题?

// .hpp 
#pragma once
template <typename T, size_t rows, size_t cols>
class Matrix {
private:
constexpr size_t m_size = rows * cols;
std::array<T, m_size> m_arr;
public:
__forceinline Matrix();
};
Matrix::Matrix() : m_arr() { // this gives errors
// do ctor stuff
}

但是,MSVC 告诉我,矩阵需要在 ctor 定义中有一个模板参数列表......

Matrix::Matrix() : m_arr() { // this gives errors

您错过了应该为定义提供的模板规范,这可能是编译器消息告诉您的:

template <typename T, size_t rows, size_t cols> // <<<< This!
Matrix<T,rows,cols>::Matrix() : m_arr() { 
// ^^^^^^^^^^^^^ ... and this
// do ctor stuff
}

。但我更喜欢在头文件中进行外部...

为此,请将定义放入一个文件中,该文件不是由构建系统原子地作为翻译单元拾取的(例如,像.icc.tcc这样的扩展名),并在包含模板类声明的标头末尾#include该扩展。

完整的代码应如下所示

Matrix.hpp

#pragma once
#include <cstddef>
template <typename T, std::size_t rows, std::size_t cols>
class Matrix {
private:
constexpr static std::size_t m_size = rows * cols;
std::array<T, m_size> m_arr;
public:
__forceinline Matrix();
};
#include "Matrix.icc"

Matrix.icc

template <typename T, std::size_t rows, std::size_t cols>
Matrix<T,rows,cols>::Matrix() : m_arr() { 
// do ctor stuff
}