gpt4 book ai didi

c++ - 理解继承的嵌套类模板的偏特化

转载 作者:行者123 更新时间:2023-11-30 04:17:21 27 4
gpt4 key购买 nike

这个问题与a previous Q&A有关其中提到了 gcc 的错误报告(据说已在 gcc 4.5.0 中修复)并涉及嵌套类模板的部分特化的一些特性。

我的设置是我有一个类 Base使用嵌套类模板 Inner部分专门用于 char (使用虚拟参数技巧,因为在类里面不允许显式指定)。

#include <type_traits>
#include <iostream>
#include <ios>

struct Base
{
// dummy template parameter...
template<class U, class _ = void> struct Inner: std::true_type {};

// ... to allow in-class partial specialization
template<class _> struct Inner<char, _>: std::false_type {};
};

我现在定义一个 Derived我想进一步专攻的类(class) Inner ,由于某些奇怪的原因不能在类里面完成(即使它仍然是部分特化)。

struct Derived
:
Base
{
// cannot partially specialize Inner inside Derived...
//template<class _>
//struct Inner<int, _>: std::false_type {};
};

// ... but specializing Derived::Inner at namespace scope, also specializes it for Base::Inner
template<class _> struct Derived::Inner<int, _>: std::false_type {};

第一个问题:为什么我必须部分特化Derived::Inner在命名空间范围内?

但最奇怪的是,当我调用 Inner 的各种偏特化时来自 BaseDerived , int 的偏特化我只为 Derived 做过, 也适用于 Base .

int main()
{
std::cout << std::boolalpha << Base::Inner<float>::value << "\n";
std::cout << std::boolalpha << Derived::Inner<float>::value << "\n";

std::cout << std::boolalpha << Base::Inner<char>::value << "\n";
std::cout << std::boolalpha << Derived::Inner<char>::value << "\n";

std::cout << std::boolalpha << Base::Inner<int>::value << "\n"; // huh???
std::cout << std::boolalpha << Derived::Inner<int>::value << "\n"; // OK
}

第二个问题:为什么是Base::Inner<int>::value等于false , 即使只有 Derived::Inner<int>是部分特化的?

Online example using gcc 4.8.0 .我专门从标准中寻找解释这种行为的引述。

最佳答案

部分特化必须重新声明与其提供替代定义的主模板相同的名称。

当您在 Derived 范围内编写 struct Inner 时,您就是在声明 Derived::InnerBase::Inner 是与 Derived::Inner 不同的名称,因此声明了一个不同的类。不可能使用声明 Derived::Inner 的声明来专门化 Base::Inner

当你在命名空间范围内编写 Derived::Inner 时,名称查找将该名称解析为 Base::Inner - 特化都是同一个类:Base::Inner,即使您将它们称为 Derived::Inner

来自标准:

[temp.class.spec]

A partial specialization of a class template provides an alternative definition of the template that is used instead of the primary definition when the arguments in a specialization match those given in the partial specialization.

关于c++ - 理解继承的嵌套类模板的偏特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17132753/

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