2010-08-26 63 views
1

即,我有两种专门的类型:继承专门的模板化基类并调用正确的方法

template <class Type, class Base> struct Instruction {}; 

编译时从列表中选择适当的类型。

喜欢:

template <class Base> struct Instruction<Int2Type<Add_Type>, Base > 
{ 
    void add() {} 
}; 

template <class Base> struct Instruction<Int2Type<Mul_Type>, Base > : 
     Instruction<Int2Type<Add_Type>, Base > 
{ 
    void mul() 
    { 
     add(); ???? <== not working (not resolved) 
    } 
}; 

什么是这个解决方案?

谢谢

马丁

回答

3

add()似乎并不依赖于任何模板参数(这不是一个“从属名称”),所以编译器不会在模板基类进行搜索。

的一种方法,使之清楚,add()应该是一个成员函数/从属名称的编译器,是明确指定this->当您使用的功能:

void mul() 
{ 
    this->add(); 
} 

this隐含取决于模板参数,这使add成为在模板化基类中查找的依赖名称。

另请参阅this entry of the C++ FAQ lite以及下一个/前一个。

+0

我不认为这适用于此。请注意,您引用的FAQ条目是指在基础中定义的嵌套类,而不是成员函数。成员函数有一个隐含的“this->”,这会使它们默认依赖。 – 2010-08-26 15:00:31

+0

@James Curran:我将链接更改为下一个FAQ条目,这更合适。问题是编译器不知道'add()'指向一个成员函数。这可能是一项免费功能。由于'add'不是依赖名称,因此不会在模板化的基类中搜索,因此找不到。 – sth 2010-08-26 15:07:36

+0

一个常见的错误:不查看基类的原因不是依赖状态。这是应用于它的名称和名称查找的形式。不合格的名称在非合格的查找期间不在相关的基类中查找。即使他们依赖。这很容易发生 - 以'运算符T()'为例,这是一个不合格的从属名称,仍然没有在依赖的基础上查找。请注意,常见问题解答有误 - 我向作者发送了关于它的信息,他同意他需要对其进行修改。 – 2010-08-26 21:35:01

1

得到它采用“利用碱方法”子句等:

using base::add; 

一个缺点是声明使用条款所有基的方法。有利的是它只隐含了独特的性质,只选择允许解决(使用)的方法。

对不起,忘记他的头某个地方的家伙的问题。