当编译器认为代码是本地链接或内联时,如何实现类静态函数的外部链接?
考虑三个文件:
traits.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外部链接?
答案 0 :(得分:0)
我认为你需要决定是否有外部联系并定义脱节或保持内联并有效地只有内部联系。有没有理由不在标题中定义您的Traits<int>
?请注意,完全特化不再是模板,因此与非模板化函数相比,它的处理方式确实没有区别。
编辑:在VS2010中尝试过这个,但它可能仍然不合适,但您可以将代码置于traitsimp.cpp
中,该代码采用该方法的地址:
auto getAddress = &Traits<int>::InlineFunction;
这会强制该方法获取地址。我对这种行为是否标准有点生疏。