根据此配置,可以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文件中的非内联版本看起来很奇怪,所以我我想避免这种情况。
答案 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文件中定义的类型。