模板类构造函数与成员函数在类外定义时是否需inline说明符?
关于模板类成员函数inline与ODR的问题解答
1. 类外定义模板成员函数是否需要手动添加inline?
对于模板类的成员函数,无需手动添加inline也不会触发ODR违规。C++标准针对模板有特殊的ODR规则:只要模板(包括其成员函数)在多个编译单元中的定义完全一致,就允许重复出现。你的.tcc文件被主头文件包含后,本质上还是头文件的一部分,符合模板定义的放置要求,因此即使不加inline也没问题。当然,显式添加inline是合法的冗余操作,不会造成问题。
2. 类内声明加inline是否会让类外定义隐式成为inline?
这个说法是正确的。根据C++标准,若在类内声明成员函数时指定了inline,无论该函数是在类内还是类外定义,都会被视为inline函数。这条规则同样适用于模板类的成员函数——类内声明加inline后,类外的定义自动具备inline属性,无需重复标注。
代码示例调整
如果想利用类内声明inline的特性,可以修改你的代码如下:
myheader.hpp
#include <cstdio> #include <utility> template <typename T> class myclass { inline myclass(T); inline auto print() -> void; T val_; }; #include "myheader.tcc"
myheader.tcc
template <typename T> myclass<T>::myclass(T val) : val_{ std::move(val) } { } template <typename T> auto myclass<T>::print() -> void { printf("There are 10 types of people in this world, those who understand binary and those who dont!\n"); }
内容的提问来源于stack exchange,提问作者glades
相关产品推荐
相关产品推荐

