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++ 我可以在fnc def内使用吗?_C++_Templates - Fatal编程技术网

C++ 我可以在fnc def内使用吗?

C++ 我可以在fnc def内使用吗?,c++,templates,C++,Templates,我有一个这样的结构: template<class X> struct Base { X get_data() { return X(); } }; template<class X> struct Derived : Base<X> { X do() { auto v = get_data();//this get is from Base } }; 模板 结构基 { X获取_数据() { 返回X(); } };

我有一个这样的结构:

template<class X>
struct Base
{
  X get_data()
  {
    return X();
  }
};

template<class X>
struct Derived : Base<X>
{
  X do()
  {
    auto v = get_data();//this get is from Base
  }

};
模板
结构基
{
X获取_数据()
{
返回X();
}
};
模板
派生结构:基
{
X do()
{
auto v=get_data();//此get来自基
}
};
如图所示,我尝试使用此get,但遇到错误:没有依赖于模板参数的“get_data”参数,因此“get_data”的声明必须可用[-fpPermissive]|
好的,我试过:

X do()
{
  using Base<T>::get_data;
  auto v = get_data();//this get is from Base
}
xdo()
{
使用Base::get_数据;
auto v=get_data();//此get来自基
}
我得到了以下
错误:'Derived::Base'不是名称空间
。现在,我遇到了一个问题,因为实际上,作为结构的Base是一个名称空间(的特殊形式),但无论如何,我声明使用
Base::get_data在任何fnc之外,这将编译。所以问题是:在fnc主体中是否允许编译器错误或使用“using declaration”

更换

using Base<T>::get_data;
使用Base::get_数据;

使用Base::get_数据;
更换

using Base<T>::get_data;
使用Base::get_数据;

使用Base::get_数据;


对基类成员名称使用
指令仅在类级别上有意义,它们用于使基类成员的名称可见,否则可能会隐藏

它们在函数范围内没有意义,因此在函数范围内是不允许的

你能做的是:

struct Derived : public Base<X>
{
  using Base<X>::get_data;
  //...
};
struct派生:公共基
{
使用Base::get_数据;
//...
};
(这仅在这里是合理的,因为您的模板上下文以及
get_data()
不依赖于任何模板参数的事实。在普通类中,如果您不是故意隐藏函数,您根本不需要这个。)

在函数范围内,唯一允许使用
指令的
是那些从其他名称空间引入名称以进行参数相关查找的指令


<>也注意到<>代码> do/Cuth>是C++关键字。

<代码>使用< /COD>基类成员名称的指令只在类级别上有意义,在这里,它们可以使基类成员的名字可见,否则可能被隐藏。 它们在函数范围内没有意义,因此在函数范围内是不允许的

你能做的是:

struct Derived : public Base<X>
{
  using Base<X>::get_data;
  //...
};
struct派生:公共基
{
使用Base::get_数据;
//...
};
(这仅在这里是合理的,因为您的模板上下文以及
get_data()
不依赖于任何模板参数的事实。在普通类中,如果您不是故意隐藏函数,您根本不需要这个。)

在函数范围内,唯一允许使用
指令的
是那些从其他名称空间引入名称以进行参数相关查找的指令


还注意到 Do/<代码>是C++关键字。

使用Base::GETYODATA;<代码> >代码>@KerrekSB抱歉我说得不够清楚。有一个使用Base::get_数据构造的方法。我明白了。这不清楚,因为你的格式被打破了,所以那块是无形的。<代码> do/COD>是C++关键字;不能将其用作函数名。@KerrekSB很抱歉,它实际上是do_it。请尝试使用Base::get_data@KerrekSB抱歉我说得不够清楚。有一个使用Base::get_数据构造的方法。我明白了。这不清楚,因为你的格式被打破了,所以那块是无形的。<代码> do/COD>是C++关键字;您不能将其用作函数名。@KerrekSB抱歉,它实际上是do_it。我的问题是,如果是编译器错误,它不允许我在fnc正文中使用using声明,而不是如何解决此问题,因为我已经解决了这个问题,正如你们从我的OP中读到的。我的问题是,如果是编译器错误,它不允许我在fnc体中使用using声明,而不是如何解决这个问题,因为我已经解决了这个问题,正如你们从我的作品中读到的。我不同意使用“声明”而不是你们提到的指令对类成员来说是没有意义的。我刚才不是给你看了一个有意义的用法吗?我只是想在这个fnc中访问get_数据。不在任何其他情况下。
使用
并不是“告诉编译器要使用哪个函数”;相反,它是关于让名字可见。仍然需要考虑ADL和过载解决方案。如果你只是想调用一个基类函数,直接限定函数名就行了。我不同意使用你提到的“声明”而不是指令对类成员来说没有意义。我刚才不是给你看了一个有意义的用法吗?我只是想在这个fnc中访问get_数据。不在任何其他情况下。
使用
并不是“告诉编译器要使用哪个函数”;相反,它是关于让名字可见。仍然需要考虑ADL和过载解决方案。如果您想直接调用基类函数,只需直接限定函数名。