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和过载解决方案。如果您想直接调用基类函数,只需直接限定函数名。