class 模板的成员函数是否可以在显式实例化的情况下内联?

Can member functions of class templates be inlined in case of explicit instantiation?

在给定此配置的情况下,doSth() 可以内联吗?

// A.h

template<typename T>
struct A
{
    void doSth();
};


// A.cpp

template<typename T>
void A<T>::doSth() { /* do something */ }

template class A<bool>;
template class A<int>;


// main.cpp

#include "A.h"

int main()
{
    A<bool> a;
    a.doSth();
}

如果答案是否定的,我会在 .tpp 文件中定义我的成员函数,并将其包含在 "A.h" 的末尾,但是对于 .tpp 文件中的非内联版本,这看起来很奇怪。 cpp 文件,所以我想避免这种情况。

你绝对可以。您还忘记了结构定义末尾的 ;

struct a
{
    // Whatever
};

本该如此。

大多数编译器无法内联这种代码排列。 ICC 编译器文档声称它支持以一种方式调用,该方式可以启用内联 AFTER 您首先构建不同的方式,然后收集分析数据,然后将分析数据反馈到跨模块优化建造。我只是做了一些适度的尝试来让它发挥作用,而且它只在游戏规模的项目中起作用,而不是在任何真实的项目中起作用。

为了与普通编译一起使用,您应该拥有用于内联函数定义的额外文件,但您可能不应该将其包含在 A.h 的末尾,而是将 A.h 包含在它的开头并将其包含在 select 真正需要它的 cpp 文件中。

我比较喜欢

// A.h
#ifndef A_H
#define A_H
template<typename T>
struct A
{
    inline void doSth();
};
#endif

// A.tpp
#ifndef A_TPP
#define A_TPP
#include "A.h"
template<typename T>
inline void A<T>::doSth() { /* do something */ }
#endif

// Various other .h files that need to know what is declared in A
#include "A.h"

// Only cpp files that need what is defined in A.tpp
#include "A.tpp"

我忘记了这个选项以及哪些编译器有这样的选项,但是在 .h 文件中几乎多余地使用 inline 带有一个编译器选项,说明以防函数以这种方式声明and used and 未定义,抛出编译时错误。

没有该选项,link 时间错误更难阅读,但确实会告诉您哪个 .cpp 需要包含 .tpp 但错过了。

Visual Studio 确实允许以这种方式进行内联,但它将您可以实例化的类型限制为您在 A.cpp 文件中定义的类型。