Bos*_*gan 5 c++ compiler-construction templates
假设你有简单的模板函数(为了简单起见,不是类成员),在同一个.h文件中具有特定于类型的特殊化...
template <class TYPE>
void some_function(TYPE& val)
{
// some generic implementation
}
template <>
inline void some_function<int>(int& val)
{
// some int specific implementation
}
Run Code Online (Sandbox Code Playgroud)
除非您明确地将编译器指向特化inline(inline关键字),否则如果.h文件被包含多次,则会出现链接错误(至少我在Visual C++ 2008中这样做).
我们都知道这inline只是对编译器的建议,它可以忽略.在这种特殊情况下,编译器是否允许忽略此建议并让链接器失败?
如果不使用inline,则会将相同的函数编译为extern链接到多个.obj文件,这会导致链接器抛出重复的符号错误.
这与编译器是否实际编译函数内联无关,因为它可以将它视为static函数,并使每个实现对每个编译单元都是私有的.但是,您不能static用于此目的,因为它对成员函数有其他意义,因此inline您唯一的选择.
你误解了经常提到的"忽略内联"可能性的含义.
任何编译器都不允许忽略inline函数声明中使用的说明符以及此说明符对单一定义规则(ODR)的影响.
当有人说允许编译器"忽略内联"时,它只意味着编译器不需要实际内联对相关函数的调用."忽略内联"意味着生成对内联函数的普通(非内联)函数调用.
在任何情况下,即使编译器决定始终生成对内联函数的普通调用(即始终"忽略内联"),仍然需要将该函数视为内联以用于ODR.编译器如何做到这一点是编译器的问题.你不应该担心它.
在您的原始示例中,您不应该收到任何链接器错误.
| 归档时间: |
|
| 查看次数: |
2377 次 |
| 最近记录: |