gpt4 book ai didi

c++ - 模板类 - 成员函数特化

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:45:19 25 4
gpt4 key购买 nike

示例代码:

template<class T>
class A
{
public:
A(T t): x(t){}
T getX();
private:
T x;
};

template<class T>
T A<T>::getX()
{
return x;
}

// member function specialization
template<> // works with and without template<>
long A<long>::getX()
{
return 1000L;
}

在成员函数专门化之前,以上代码在使用和不使用模板<> 的情况下都有效。为什么 ?在这种情况下有什么区别?

编辑1:我以这种方式使用该模板(VS 2012 编译器):

A<int> a1(1);
cout<<a1.getX()<<endl;
A<long> a2(1);
cout<<a2.getX()<<endl;

最佳答案

不合规,不合规。

FWIW,GCC 4.8 rejects your code without the template <> .

你的编译器要么有问题,要么有一个扩展来支持它;我可以确认 MSVS 2012 接受该代码。我听说 MSVS 2013 年 11 月 CTP 也毫无怨言地吃光了它。公平地说,Visual Studio 对模板规范总是相当宽松。

[C++11: 14.7/3]: An explicit specialization may be declared for a function template, a class template, a member of a class template or a member template. An explicit specialization declaration is introduced by template<>. [..]

此规则的唯一异常(exception)是:

[C++11: 14.7.3/5]: [..] Members of an explicitly specialized class template are defined in the same manner as members of normal classes, and not using the template<> syntax. [..]

……但这并不适用于此。

关于c++ - 模板类 - 成员函数特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20817378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com