C++ C++;无法从派生类内调用基类方法
这是我的第一个问题,我希望我做的每件事都是正确的 我试图从boost元组派生一个类。Boost的元组提供了一个get()模板方法来访问各个字段。有趣的是,我不能在派生类中使用该方法 以下代码显示了该问题:C++ C++;无法从派生类内调用基类方法,c++,boost,boost-tuples,C++,Boost,Boost Tuples,这是我的第一个问题,我希望我做的每件事都是正确的 我试图从boost元组派生一个类。Boost的元组提供了一个get()模板方法来访问各个字段。有趣的是,我不能在派生类中使用该方法 以下代码显示了该问题: #include <iostream> #include <boost/tuple/tuple.hpp> using namespace std; template<typename A> class Derived : public boost::tup
#include <iostream>
#include <boost/tuple/tuple.hpp>
using namespace std;
template<typename A>
class Derived : public boost::tuple<A>
{
public:
Derived() : boost::tuple<A>() {}
A& getVal0()
{
return get<0>();
// does not compile:
//error: 'get' was not declared in this scope
return boost::tuple<A>::get<0>();
// does not compile
//error: expected primary-expression before ')' token
return boost::tuples::get<0>(*this);
//works
}
};
int main() {
Derived<int> a;
a.get<0>() = 5;
cout << a.get<0>() << endl;
cout << a.getVal0() << endl;
return 0;
}
第二个返回行是我尝试对基类的方法调用进行作用域:
return boost::tuple<A>::get<0>();
调用外部函数`boost::tuples::get(*this)可以工作。这个解决方法对我来说没问题。但是我仍然想知道为什么我现在不能使用tuple方法
boost文档中有一个关于visualc的通知++
注意!MS Visual C++编译器不支持成员获取函数。此外,编译器很难在没有显式命名空间限定符的情况下找到非成员get函数。因此,在编写应使用MSVC++6.0编译的代码时,所有get调用都应限定为:tuples::get(a_tuple)
但我使用的是GCC4.5.2和4.8.1
提前感谢假设基类中有一个
get()
成员函数模板,您可能需要使用
this->template get<0>()
this->template get()
this
部分是使其成为依赖查找所必需的(您也可以使用适当的类限定,但这有点麻烦,而且没有必要,除非您隐藏基类名称)。template
部分用于告诉编译器依赖名称(get
)恰好是一个模板
需要此
(或某些其他限定条件)和模板
的主要原因是模板的两阶段编译模型:
- 任何不立即依赖于某种形式的模板参数的名称都只在第一阶段(即在定义模板的上下文中)查找。由于模板参数未知,因此基类的确切布局未知(可能是专门化的),因此基类中的任何名称都将被忽略。使用使名称依赖于模板参数的任何限定,例如使用
,将查找移动到第二阶段,即模板实例化时this->
- 一旦一个名字是相关的,如果一个表达涉及一个
+1,就会产生歧义。我必须这样说:撇开主题不谈,你的问题应该作为在这个网站上发布的任何新用户的一个例子。你有一个好问题所需要的一切,包括(1)你认为你有问题,(2)展示问题的示例代码,(3)解决问题的尝试,(4)这些尝试的每一个结果,(5)你正在使用的工具,包括版本信息,(6)研究你认为根本问题可能是什么。对于一个职位来说,这是非常棒的;对于第一篇文章来说,这是非常出色的,很少有这样的表达。WhozCraig很高兴你能给一个初学者这么多好的词语和积极的评价advices@piotruś发布这样的问题并不难。我非常认真地认为这是一个模范。我只是希望OP知道如何标记一个解决方案,因为我很确定Dietmar有它=P@WhozCraig. 我想我知道如何将解决方案标记为已接受。或者至少我应该这么做。最大的问题是为什么会发生这种情况。多亏了我找到的“this->template”提示$在C++中,C++编程语言解释了问题。但是我仍然不知道为什么在派生类中需要这样做。@EvilAzrael:我在答案中添加了一些解释。谢谢你的解释。:-)
return boost::tuple<A>::get<0>();
error: expected primary-expression before ')' token
this->template get<0>()