Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;无法从派生类内调用基类方法_C++_Boost_Boost Tuples - Fatal编程技术网

C++ C++;无法从派生类内调用基类方法

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

这是我的第一个问题,我希望我做的每件事都是正确的

我试图从boost元组派生一个类。Boost的元组提供了一个get()模板方法来访问各个字段。有趣的是,我不能在派生类中使用该方法

以下代码显示了该问题:

#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>()