C++ 使用作为不带限定符的模板参数提供的基类的成员
此代码适用于:C++ 使用作为不带限定符的模板参数提供的基类的成员,c++,C++,此代码适用于: struct Defs { static const int a = 1; int b{}; void g() {} }; struct Bob : Defs { void f() { cout << a << "\n"; cout << b << "\n"; g(); } }; int main() { Bob b;
struct Defs
{
static const int a = 1;
int b{};
void g() {}
};
struct Bob : Defs
{
void f()
{
cout << a << "\n";
cout << b << "\n";
g();
}
};
int main()
{
Bob b;
b.f();
}
struct Defs
{
静态常数INTA=1;
int b{};
void g(){}
};
结构Bob:Defs
{
void f()
{
cout您可以添加:
using D::a;
using D::b;
using D::g;
到Bob
来解决范围问题
是对这个问题的全面概述。老实说,C++的一个角落不应该存在,但是,没有语言是完美的= P</P>引言
出现错误是因为基类依赖于模板参数,这并不奇怪,因为基类直接使用模板参数
错误诊断源于这样一个事实:不同的模板参数可能会在类内产生显著不同的行为;如果传入的模板参数没有特定的成员,该怎么办;然后我们是否要在全局范围内查找某些内容
明确说明您希望访问此
你是说你想访问基类的成员而不必对他们进行限定,如果我真的这么说的话,我会说你可以使用this->member name
——但我怀疑这是你在写了关于重构的文章之后得到的结果
struct A {
int m;
};
上述内容可以理解为:“亲爱的编译器,无论我指的是m
,我都希望您使用T
中的一个。”
但我想解决这个问题,怎么解决!? 好的,引入一个非依赖基,并让它引入对您真正想要的数据的引用。如果您知道每个
T
都要引入哪些名称,这将起作用
您甚至可以扩展此黑客程序,使其自动推断出这些成员的类型,但这与问题的范围相去甚远
#include <iostream>
struct A {
int n;
int m;
void print () {
std::cout << m << std::endl;
}
};
#包括
结构A{
int n;
int m;
作废打印(){
std::cout n){}
国际和m;
国际及北;
};
模板
结构B:T,Hack{
B():Hack(static_cast(this)){}
void func(){
m=123;
}
};
int main(){
B.警告一句;我个人永远不会这样做,但正如你所看到的,通过一点间接的方式,你可以做你要求的事情。Hm有没有办法,而不需要将其添加到许多类中?@NeilKirk不是真的,没有。你可以使用D:::
s将添加到类中或在使用这些变量的范围中,或者r每次使用this->
或D::
查看变量。这些是选项。@NeilKirk请参阅标题为“但我想解决这个问题;如何解决!”在我的回答中;是为你添加的。@FilipRoséen refp的代码比仅仅为每个变量使用D::a编写,要多得多,而且要清楚得多。@David如果你有很多需要它的类,那就不会了,我想这是因为否则OP就是懒惰的(如果他懒得为一个类更改它的话)。@sehe
using D::a;
using D::b;
using D::g;
struct A {
int m;
};
template<class T>
struct B : T {
void func () {
this->m = 1;
}
};
int main () {
B<A> {}.func ();
}
template<class T>
struct B : T {
using T::m;
void func () {
m = 1;
}
};
#include <iostream>
struct A {
int n;
int m;
void print () {
std::cout << m << std::endl;
}
};
struct Hack {
template<class T>
Hack (T* hck) : m (hck->m), n (hck->n) { }
int& m;
int& n;
};
template<class T>
struct B : T, Hack {
B () : Hack (static_cast<T*> (this)) { }
void func () {
m = 123;
}
};
int main () {
B<A> b;
b.func ();
b.print ();
}