繁体   English   中英

为什么必须在类外使用template <>对成员模板方法进行专门化

[英]Why member template method have to be specialized using template<> outside of class

我不清楚编译器何时以及如何创建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:为什么必须在类之外使用template <>对成员模板方法进行专门化处理?

示例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.成员模板是否曾经专门化?

未调用成员模板模板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

生活

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM