gpt4 book ai didi

非类型模板参数的 C++ 类偏特化

转载 作者:搜寻专家 更新时间:2023-10-31 02:13:19 26 4
gpt4 key购买 nike

我不确定我的术语是否正确,但我想我有一个类模板,它同时包含类型模板参数和非类型模板参数,我想只部分专注于非类型参数:

template<class T, int I> struct A
{
void f();
};

template<class T> void A<T, 1>::f() {}

int main()
{
A<int, 1> a1;
a1.f();
}

使用 Visual C++ 我得到 error C3860: template argument list following class template name must list parameters in the order used in template parameter listerror C2976: 'A<T,I>': too few template arguments .

但是,如果我删除类型参数,那么我似乎可以专注于非类型参数:

template<int I> struct B
{
void g();
};

void B<1>::g() {}

int main()
{
B<1> b1;
b1.g();
}

那么我想要的是不可能的,还是我没有以正确的方式去做?如果不可能,是否有替代方案?

最佳答案

让我们考虑一下 standard 是什么(工作草案)说:

A member [...] of a class template may be explicitly specialized for a given implicit instantiation of the class template, even if the member [...] is defined in the class template definition. An explicit specialization of a member [...] is specified using the syntax for explicit specialization.

换句话说,你试图做的事情是不允许的。
就这样。


想象一下,如果是这样,从政治学上讲,您也可以这样做:

template<class T, int>
struct A { void f(); };

template<typename T>
void A<T, 1>::f() {}

template<>
struct A<int, 1> {};

即定义f对于一个类模板,其特化甚至不能声明 f .
这没有多大意义,是吗?

另一方面,考虑以下成员特化:

template<>
void A<int, 1>::f() {}

它导致 A<int, 1> 的实例化无法进一步专门化。
换句话说,在这种情况下你不能这样做:

template<>
struct A<int, 1> {};

f 的存在以某种方式保证因此。

关于非类型模板参数的 C++ 类偏特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41574134/

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