为什么必须使用模板<>来专门设置成员模板方法?课外

时间:2015-09-16 03:51:15

标签: c++ templates c++11

我不清楚编译器何时以及如何创建template函数。所以我无法解释以下两个例子的行为。

示例1.

struct C1 {                                                    
    template <typename T>
    void g(T t);
};

template<>   
void C1::g(double x) {
    cout << "Member templates. C1::g(double) " << x << endl;
}

以上代码构建并运行。但是,如果没有template<>,g ++就会抱怨。

error: prototype for ‘void C1::g(double)’ does not match any in class ‘C1’

但如果我将g(double)的定义放在类中,那就没关系。

问题1: 为什么必须使用模板&lt;&gt;来专门设置成员模板方法?课外?

示例2。

struct C1 {                                                          
    template <typename T>
    void g(T t);

    void g(double x) {
        cout << "C1::g(double): " << x << endl;
    }
};

template<>
void C1::g(double x) {
    cout << "Member templates. C1::g(double) " << x << endl;
}

C1 c;
c.g(10.5); // output: C1::g(double): 10.5

不调用成员模板模板void g()。这让我想知道

问题2。会员模板是否专业化?

1 个答案:

答案 0 :(得分:1)

  

不调用成员模板模板void g()。这让我想知道

这里的函数重载问题,非模板函数将在重载分辨率上赢得模板专业化。

http://en.cppreference.com/w/cpp/language/overload_resolution

  

最佳可行功能

     

对于每对可行函数F1和F2,从第i个参数到第i个参数的隐式转换序列被排序以确定哪一个更好(除了第一个参数,静态成员函数的隐式对象参数)对排名没有影响)

     

如果F1的所有参数的隐式转换都不比F2的所有参数的隐式转换差,则确定F1是比F2更好的函数,并且

     

1)至少有一个F1参数,其隐式转换优于F2参数的相应隐式转换

     

2)或。如果不是这样,(仅在通过转换进行非类初始化的上下文中),从返回类型F1到正在初始化的类型的标准转换序列优于来自返回类型F2的标准转换序列

     

3)或者,如果不是这样,F1是非模板函数,而F2是模板特化

     

4)或者,如果不是这样,F1和F2都是模板特化,F1根据模板特化的部分排序规则更加专业化

您可以明确调用模板特化功能:

c.g<>(10.5); // output: Member templates. C1::g(double) 10.5

LIVE