如何将指针成员传递给模板参数?
很难解释,所以我会展示一个很短的代码来表明问题。
这是一个有效的代码: -
template<class T, int T::*a> class B{...}
class A{ public: int mem; }
int main(){
A a;
B<A,&A::mem> b= B<A,&A::mem>(a); // I pass "A" as value
}
现在我想传递指针而不是值,如下所示: -
template<class T, int T::*a> class B{...}
class A{ public: int mem; }
int main(){
A* a=new A(); //changed
B<A*,&A*::mem> b= B<A*,&A*::mem>(a); //changed, pass "A*" (#)
}
这是我得到的编译错误。
prog.cpp:18:13: error: template argument 2 is invalid
B<A*,&A*::mem> b=B<A*,&A*::mem>(a);
^
我错了(#)。我该如何编辑这条线?
这是完整的代码: -
class A{
public: int x=2;
};
template <class T, int T::*a> class B{
T objectA_;
public: B(T objectA){
objectA_ = objectA;
}
public: void print(){
std::cout<< objectA_.*a ;
}
};
int main() {
A objectA; objectA.x=3;
B<A,&A::x> objectB=B<A,&A::x>(objectA); //this line will be changed
objectB.print(); //print 3
return 0;
}
请注意,T = A. 现在,我想要T = A *。
新版
template <class T, int A::*a> class B{
T objectA_;
public: B(T objectA){
objectA_ = objectA;
}
public: void print(){
std::cout<< objectA_->*a ; //changed
}
};
int main() {
A* objectA = new A(); objectA->x=3; //changed
B<A*,&A*::x> objectB=B<A*,&A*::x>(objectA); //changed
objectB.print();
delete objectA; //new
return 0;
}
答案 0 :(得分:1)
B<A, &A::mem>
仍然是正确的形式。你需要改变的是类定义。
template<class T, int T::*a>
class B
{
T *object_;
public:
B (T* pObj) : object_(pObj) {}
};
但如果您有权访问智能指针实现(c ++ 11或其他),则更喜欢存储而不是原始指针。如果不这样做,则必须遵守the rule of three (now rule of five in c++11)。
此外,如果您进行初始值而不是复制初始化,则可以大大简化您的生活。
B<A, &A::mem> b(a);
B<A, &A::mem> b(&a);