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 ();
}