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

我试图在类定义下创建一个模板类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告诉我,Matrix需要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
}
链接地址: http://www.djcxy.com/p/37141.html

上一篇: defining inline functions under template class definition

下一篇: C++