Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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++ 是否可以在固定命名空间下解析模板类型?_C++_Templates_Namespaces_Decltype_Typename - Fatal编程技术网

C++ 是否可以在固定命名空间下解析模板类型?

C++ 是否可以在固定命名空间下解析模板类型?,c++,templates,namespaces,decltype,typename,C++,Templates,Namespaces,Decltype,Typename,鉴于以下类型: struct Object { using NestedAlias = bool; }; namespace Hidden { struct Object { using NestedAlias = bool; }; } 我理解从模板的命名空间解析类型是可能的 template <typename Type> void legal(Type type) { using Alias = typename Type::N

鉴于以下类型:

struct Object {
    using NestedAlias = bool;
};

namespace Hidden {
    struct Object {
        using NestedAlias = bool;
    };
}
我理解从模板的命名空间解析类型是可能的

template <typename Type>
void legal(Type type) {
    using Alias = typename Type::NestedAlias;
}

legal(Object{});
模板
无效法律(类型){
使用Alias=typename Type::NestedAlias;
}
法律(对象{});
但是,当模板类型位于resolution操作符的右侧,而左侧是命名空间时,我无法解析。可能吗

template <typename Type>
void illegal(Type type) {
    using Alias = Hidden::Type;
    using Alias = Hidden::decltype(Type);
    using Alias = typename Hidden::Type;
    using Alias = typename Hidden::decltype(Type);
}
模板
无效非法(类型){
使用Alias=Hidden::Type;
使用Alias=Hidden::decltype(Type);
使用Alias=typename隐藏::Type;
使用Alias=typename Hidden::decltype(Type);
}
对于那些想知道用例是什么的人:

template <typename Type>
void double_object_use_case(Type type) {
    Hidden::Type hidden_type;
    operation_on_both_types(type, hidden_type);
}
模板
无效双\u对象\u用例(类型){
隐藏::类型隐藏\u类型;
两种类型上的操作类型(类型、隐藏类型);
}

要使用的锁销链接:

模板不适用于名称,但适用于类型(或值)

目前,使用名称的唯一方法是宏

另一种方法是添加隐藏类型作为别名:

  • 在课堂上:

    namespace Hidden {
        struct Object {
            using NestedAlias = bool;
        };
    }
    
    struct Object {
        using NestedAlias = bool;
    
        using Hidden = Hidden::Object;
    };
    
    template <typename Type>
    void double_object_use_case(Type type) {
        typename Type::Hidden hidden_type;
        operation_on_both_types(type, hidden_type);
    }
    
    名称空间隐藏{
    结构对象{
    使用NestedAlias=bool;
    };
    }
    结构对象{
    使用NestedAlias=bool;
    使用Hidden=Hidden::Object;
    };
    模板
    无效双\u对象\u用例(类型){
    typename类型::隐藏类型;
    两种类型上的操作类型(类型、隐藏类型);
    }
    
  • 作为特征:

    struct Object {
        using NestedAlias = bool;
    };
    
    namespace Hidden {
        template <typename> struct Traits;
    
        template <>
        Traits<Object> {
            using NestedAlias = bool;
        };
    }
    
    template <typename Type>
    void double_object_use_case(Type type) {
        typename Hidden::Traits<Type> hidden_type;
        operation_on_both_types(type, hidden_type);
    }
    
    struct对象{
    使用NestedAlias=bool;
    };
    命名空间隐藏{
    模板结构特征;
    模板
    特征{
    使用NestedAlias=bool;
    };
    }
    模板
    无效双\u对象\u用例(类型){
    typename隐藏::Traits隐藏类型;
    两种类型上的操作类型(类型、隐藏类型);
    }
    

这毫无意义。您的模板类型已经是一个类型,将名称空间粘贴到现有类型是毫无意义的。您在这里试图实现什么?为什么你认为你需要在那里粘贴一个名称空间?@tkausl(cc StoryTeller)我已经用我的用例更新了帖子。我需要对模板类型和特定名称空间中完全相同的类型名称(但不同的对象)进行操作。显然,…@P.W One可以实现一个解决方案,精确地映射问题-使用宏,而不是模板,因为后者需要语言不支持的功能。然而,问题是,这个解决方案是否适合真正需要解决的问题。如果回到我的取暖示例:“我需要一个风扇加热器-我在哪里可以买到?”我们现在都会说“去下一个DIY商店!”,但如果用户问“我的公寓很冷,我怎样才能让它更暖和?”我们只会说“把恒温器调高”。现在哪种解决方案更合适?