Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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_Syntax_Variadic Templates_Template Meta Programming - Fatal编程技术网

C++ 模板基类函数成员的别名

C++ 模板基类函数成员的别名,c++,templates,syntax,variadic-templates,template-meta-programming,C++,Templates,Syntax,Variadic Templates,Template Meta Programming,我正在编写使用大量模板的代码,我经常会遇到如下代码: template<class T, class V> struct Base { Base(int a) {} }; template<class T, class V> struct Derived : public Base<T,V> { using Base<T,V>::Base; // [1] ok it works using Base::Base; // [2] Does

我正在编写使用大量模板的代码,我经常会遇到如下代码:

template<class T, class V>
struct Base {  Base(int a) {} };

template<class T, class V>
struct Derived : public Base<T,V>
 {
 using Base<T,V>::Base; // [1] ok it works
 using Base::Base; // [2] Does not work  
 };
模板
结构基{Base(inta){};
模板
结构派生:公共基
{
使用Base::Base;//[1]好的,它可以工作
使用Base::Base;//[2]不起作用
};

想想看,如果你写的不是更有意义的名字,那么[1]语句就太长了。。没有办法使用像[2]这样的语句吗?或者在即将到来的C++标准中有什么可以简化这一点吗?

< p>可以用:

定义类型别名。
template<class T, class V>
struct Derived : public Base<T,V>
{
    using BaseClass = Base<T,V>;
    using BaseClass::Base;
};
模板
结构派生:公共基
{
使用BaseClass=Base;
使用BaseClass::Base;
};
<>代码>使用关键字在C++中有三个含义。它可以介绍:

  • 使用指令
  • 使用声明
  • 或类型别名
A的形式为
使用名称空间please\u not\u std
,并将
please\u not\u std
名称空间中的任何内容带到当前范围(这是一种简化)

A的形式为
using Class::name
,并在当前范围的其他地方引入了一个定义的名称


A的形式为
使用新类型=现有类型
,并定义。。。类型别名。

仅使用
Base::Base
的问题是名称
Base
(在左侧)应该是父
Base
的注入类名,但由于父类是依赖的,因此不会搜索名称,因此也不会找到注入的类名

您可以通过在依赖上下文中使用注入的类名来解决这个问题,以便将其查找推迟到实例化。像这样:

template<class T, class V>
struct Derived : public Base<T,V>
 {
 using Derived::Base::Base;
 };
模板
结构派生:公共基
{
使用派生::Base::Base;
};

<代码>派生通常被发现(它是这个实例化注入的类名),并且已知是依赖的,因此中间的 Base<代码>是已知的,只有在实例化<代码>派生< /代码>时才被查找,此时所有的基础都是已知的并且可以被搜索。您可以将注入的类名用于此类目的。这里的问题是,这个注入的类名是模板基类的一个成员,因此它是形式上依赖的,因此它不会被需要在

using base::base
中拾取第一个
base
的非限定查找找到

但我们可以在这里操纵查找的工作方式:

template<class T, class V>
struct Derived : public Base<T,V>
{
    using Derived::Base::Base;
};
模板
结构派生:公共基
{
使用派生::Base::Base;
};

Derived
Derived
的注入类名。我们发现了,现在我们正在对
Base
进行限定查找,因此依赖性不再是一个问题。

是的,我已经在这样做了,但是输入太多,错误太多了。请进一步解释。这太棒了,这正是我要找的!你在哪里学的这些东西?@svoltron那么,如果是这样,请点击答案分数下的复选标记,接受讲故事人的答案;)@svoltron-回答语言律师的问题,并在我自己的代码中跌跌撞撞地进入语言的这些黑暗角落。我从来没有真正面对过你的具体问题,但这种情况在我的脑海中闪现。好吧,你应该为此感到骄傲,然后非常感谢你,对Storyteller来说也是一样,这种技术对于模板代码来说太棒了@svoltron同样的评论。是的,不确定在这种情况下接受哪一个,他们都是对的,同时回答我想我必须这样做eheh@svoltron没问题,很高兴我帮了忙。