以下代码有一个promise类,它接受来自此类和输入的类,函数,并在被要求时将其计算为结果var。有一个vector类可以用promise和promise测试类初始化,为了这个问题的目的,它实现了调整矢量变量大小的承诺。
在主要内容中,我创建了两个promise
测试变量:一个用于vector int,另一个用于vector double。问题是代码将无法编译,如下所示(使用g ++ SUSE Linux 4.3.4修订版152973),但如果删除t1
和v1
,则编译并运行正常。我得到的编译错误说编译器无法看到vector double变量的模板promise构造函数。
任何想法可能会发生什么?它就像测试/矢量对的第一个实例化影响第二个。
#include <iostream>
#include <vector>
using namespace std;
#define FUNC(O, I, R, F) void(O::*F)(const I&, R&) const
template<typename O, typename I, typename R, FUNC(O, I, R, F)>
struct promise
{
promise(const O& _o, const I& _x) : o(_o), x(_x)
{ }
inline void eval_into(R& r) const
{
(o.*(F))(x, r);
}
const O& o;
const I& x;
};
template<typename T>
struct vec: public vector<T>
{
typedef vector<T> base;
vec(const vec& v) : base(v)
{ }
vec() : base()
{ }
template<typename O, typename I, FUNC(O, I, vec, F)>
vec(const promise<O, I, vec, F>& p)
{
p.eval_into(*this);
}
};
template<typename T>
struct promise_test
{
typedef vec<T> vect;
inline void eval_f(const int& s, vect& r) const
{
r.resize(s);
}
typedef promise<promise_test, int, vect, &promise_test::eval_f> promise_type;
inline promise_type f(const int& s) const
{
return promise_type(*this, s);
}
};
int main(int argc, char** argv)
{
int x = 5;
promise_test<int> t1;
vec<int> v1(t1.f(x));
promise_test<double> t2;
vec<double> v2(t2.f(x));
cout << v2.size() << endl;
return 0;
}