为什么使用模板生成的函数的符号类型为“弱”?

时间:2019-10-04 18:58:53

标签: c++ templates weak-symbol

创建了模板函数C++ template <class T> void myswap(T&d,T&s)。 Main将其用于int,double,复杂类型。 使用g ++编译源代码。 通过nm转储符号表时,为每种类型生成的函数的符号类型为“ W”。

为什么将它们生成为弱符号?


#include <iostream>
#include <complex>

template <class T>
void myswap(T& d, T& s)
{
    T temp = d;
    d=s;
    s=temp;
}

int main(void)
{
    int m=5,n=6;
    std::cout << "m=" << m << " n=" << n <<std::endl;
    myswap(m,n);
    std::cout << "m=" << m << " n=" << n <<std::endl;

    double p=4.3,q=5.6;
    std::cout << "p=" << p << " q=" << q <<std::endl;
    myswap(p,q);
    std::cout << "p=" << p << " q=" << q <<std::endl;

    std::complex<double> r(2.3,5.7), s(1.2,3.4);
    std::cout << "p=" << r << " q=" << s <<std::endl;
    myswap(r,s);
    std::cout << "p=" << r << " q=" << s <<std::endl;

    return 0;

}

1 个答案:

答案 0 :(得分:5)

通过隐式实例化生成的功能模板专业化与内联函数相似,因为如果多个转换单元生成相同的实例化,则不会违反ODR。如果不是这样,那么模板将几乎无法使用。

弱链接是在典型的实现中使之成为可能的机制。