在明确实例化的情况下,是否可以内联类模板的成员函数?

时间:2015-12-16 18:26:38

标签: c++ templates inline 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文件中定义我的成员函数,并将其包含在“啊”的末尾,但这对于.cpp文件中的非内联版本看起来很奇怪,所以我我想避免这种情况。

3 个答案:

答案 0 :(得分:1)

大多数编译器都无法使用这种代码排列。 ICC编译器文档声称它支持以一种方式调用,该方式可以使内联 AFTER 首先构建不同的方式,然后收集分析数据,然后将分析数据反馈到交叉模块优化构建。我只是勉强尝试让它发挥作用,它只适用于游戏规模项目,而不是任何真实的项目。

为了与普通编译一起使用,你应该为你想要内联的函数定义提供额外的文件,但是你可能不应该把它包含在Ah的末尾,而是在它的开头包含Ah并将它包含在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的几乎多余的使用与编译器选项一起说明,如果函数被声明为使用未定义,抛出编译时错误。

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

答案 1 :(得分:0)

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

struct a
{
    // Whatever
};

它应该如何。

答案 2 :(得分:0)

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