类静态功能外部链接

Class static function external linkage

本文关键字:链接 外部 功能 静态      更新时间:2023-10-16

当编译器认为代码是本地链接或内联时,如何实现类静态函数的外部链接?

考虑三个文件:

特征.h:

template <typename T>
struct Traits
{
    static int InlineFunction(T);
    static int Function(T);
};

traitsimp.cpp:

#include "traits.h"
template <>
struct Traits<int>
{
    static int InlineFunction(int) { return 42; }
    static int Function(int);
};
int Traits<int>::Function(int i) { return i; }

main.cpp:

#include "traits.h"
int main()
{
    int result = Traits<int>::Function(5);
    result = Traits<int>::InlineFunction(result);
    return 0;
}

编译时接收:

$ g++ traitsimp.cpp main.cpp -o traitstest
/tmp/cc6taAop.o: In function `main':
main.cpp:(.text+0x1b): undefined reference to `Traits<int>::InlineFunction(int)'
collect2: ld returned 1 exit status

如何说服编译器在类定义中编写函数的同时,为InlineFunction提供外部链接?

我认为您需要决定是进行外部链接并定义越界,还是保持内联并有效地只进行内部链接。是否有理由不在标题中定义Traits<int>?请注意,完全专业化不再是一个模板,因此与非模板化函数相比,它的处理方式实际上没有什么区别。

编辑:在VS2010中尝试过,可能仍然不适合,但您可以将代码放在traitsimp.cpp中,该代码采用方法的地址:

auto getAddress = &Traits<int>::InlineFunction;

这将强制该方法获取地址。我对这种行为是否标准有点生疏。