gpt4 book ai didi

c++ - 使用 typename::的模板结构特化

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

我想用在另一个结构 A 中定义的类型来专门化结构 B。

可以在帖子中看到 MWE。

首先,令我惊讶的是 B 的两个特化可以同时存在。我添加了第二个来显示问题。如果删除,代码将看不到 B 的适当特化。我宁愿只保留第一个专业。

所以,我的问题是:

  • 为什么B的两个特化可以并存?
  • 为什么第一个不适用于 main 的实例化?

定义.h :

template <class T>
class X {};

template <class T>
class Xitem {};


template <class T>
struct A;

template <class T>
struct A< X<T> > {
typedef Xitem<T> Titem;
};

template <class T>
struct B;

template <class T>//I need this one only
struct B< typename A< X<T> >::Titem > {
static void foo() {
std::cout << "foo 1" << std::endl;
}
};

template <class T>
struct B< Xitem<T> > {
static void foo() {
std::cout << "foo 2" << std::endl;
}
};

main.cpp :

#include "definitions.h"

int main(int argc, char *argv[]) {

B< A< X<int> >::Titem >::foo();
}

输出:“foo 2”使用 Xcode 7

最佳答案

Igor Tandetnik 在评论中给出的答案:

假设您使用 B。您似乎期望编译器为每个可能的类型 T 实例化 A>,希望可能存在恰好具有成员 typedef int Titem 的特化(或证明没有这样的)。或者参与定理证明练习以证明,根据 A 的当前可见定义和特化,没有可能的 T 可能导致 A< X >::Titem 是一个 int。编译器不会走这么远;它改为将 T 声明为不可推导的上下文,并且从不使用此特化。

关于c++ - 使用 typename::的模板结构特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42228958/

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