这是我的第一个问题,我希望我做的一切都是正确的。
我尝试从 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;
}
我想知道为什么我可以get<0>()
从主函数访问该方法
a.get<0>() = 5;
但不是来自A& getVal0()
方法内部:
error: 'get' was not declared in this scope
第二个返回行是我尝试将方法调用范围限定为基类:
return boost::tuple<A>::get<0>();
这会产生不同的错误
error: expected primary-expression before ')' token
调用外部函数 `boost::tuples::get<0>(*this) 有效。这种解决方法对我来说没问题。但是我仍然想知道为什么我现在不能使用 tuple 方法。
在 boost 文档中是 Visual C++ 的通知
笔记!MS Visual C++ 编译器不支持成员 get 函数。此外,编译器很难找到没有显式命名空间限定符的非成员 get 函数。因此,在编写应使用 MSVC++ 6.0 编译的代码时,所有 get 调用都应限定为:tuples::get(a_tuple)。
但我使用的是 GCC 4.5.2 和 4.8.1
提前致谢