c++ - 在模板特化的情况下,是否允许编译器忽略内联?

标签 c++ templates compiler-construction

假设您有一个简单的模板函数(为了简单起见,不是类成员),在同一个 .h 文件中具有特定于类型的特化...

template <class TYPE>
void    some_function(TYPE& val)
{
    // some generic implementation
}

template <>
inline void some_function<int>(int& val)
{
    // some int specific implementation
}

除非您明确指示编译器inline 特化(inline 关键字),否则如果 .h 文件被多次包含(至少我是这样),您将收到链接错误在 Visual C++ 2008 中)。
我们都知道inline只是给编译器的一个建议,它可以忽略。在这种特殊情况下,是否允许编译器忽略此建议并让链接器失败?

最佳答案

如果您不使用inline,那么同一个函数会通过extern 链接编译成多个.obj 文件,这会导致链接器抛出重复符号错误。

这与编译器是否实际上内联编译你的函数无关,因为它可以将它视为一个static函数,并使每个实现对每个编译单元都是私有(private)的.但是,您不能为此目的使用 static,因为它在成员函数上有其他含义,因此 inline 是您唯一的选择。

关于c++ - 在模板特化的情况下,是否允许编译器忽略内联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1760291/

相关文章:

c++ - C++虚函数的重载解析——引用与指针

c++ - 带有参数包的类模板的构造函数给出 C3520 错误

c++ - 我应该如何将 C++ 元程序与 C 代码进行比较? (运行 )

c++ - 如何在完整的专用模板类定义之外定义模板成员函数?

java - 如何从 Java 调用 Cygwin C 编译器 GCC?

c++ - 努力使 '==' 运算符重载工作 (C++)

c++ - 多线程中的单例使用

c++ - 在两个数据结构中持有相同的唯一指针

compiler-construction - 在 Makefile 中设置编译器名称

gcc - 较高级别的 SSE 标志是否意味着 GCC/clang 中较低级别的标志?