Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用typename:的模板结构专门化:_C++_C++11_Templates_Specialization_Typename - Fatal编程技术网

C++ 使用typename:的模板结构专门化:

C++ 使用typename:的模板结构专门化:,c++,c++11,templates,specialization,typename,C++,C++11,Templates,Specialization,Typename,我想用在另一个结构a中定义的类型专门化结构B 你可以在柱子上看到一个中景 首先,我很惊讶B的两个专业可以同时存在。我添加了第二个以显示问题。如果删除了,代码就看不到B的适当专门化。 我宁愿只保留第一个专业 因此,我的问题是: 为什么B的两个专门化可以同时存在 为什么第一个不适用于main的实例化 定义.h: template <class T> class X {}; template <class T> class Xitem {}; template <

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

你可以在柱子上看到一个中景

首先,我很惊讶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;
    }
};
模板
类X{};
模板
类Xitem{};
模板
结构A;
模板
结构A{
类型def-Xitem滴度;
};
模板
结构B;
模板//我只需要这个
结构B::Titem>{
静态void foo(){

标准::coutIgor Tandetnik评论中给出的答案:


假设您使用,例如,B。您似乎期望编译器为每个可能的类型T实例化A>,希望可能存在一个专门化,该专门化碰巧有一个成员typedef int Titem(或者证明没有这样的专门化)。或者参与一个定理证明练习,以证明在a的当前可见定义和专门化的情况下,没有可能的T会导致a::Titem是int。编译器不会走这么长的路;相反,它会声明T是不可推断的上下文,并且从不使用此专门化。

我猜这是一个vio一个定义规则的重复,编译器只是“选择了一个”执行,但我不能完全确定该评估。第一个永远不能使用,因为无法推断
T
。在最近的时间,。我认为它不需要第一个专门化,因为它无法解析T的类型。gcc在编译代码时给了我一条错误消息:模板参数不能在部分专门化中推断如果我显式地命名模板中使用的类型(int而不是T),它会工作,但显然不是您想要的。谢谢您的评论。因此,长话短说,用“typename::”专门化一个结构(不确定如何命名)是不可能的?如果有一个模板涉及到您使用的dimagine,比如说,
B
。您似乎希望编译器为每个可能的类型
T
实例化
a
,希望可能存在一个正好有一个成员
typedef int Titem
的专门化(或证明不存在此类情况)。或者参与一个定理证明练习,以证明在当前可见的
a
定义和专门化的情况下,
T
不可能导致
a::Titem
int
。编译器不会走这么长的路,而是将
T
声明为不可推断的上下文,而且从不使用这种专门化。
#include "definitions.h"

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

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