我一直在尝试使用模板成员函数在我的类中设置一个值.我想用一个通用的参考,这样我可以接受的正确类型的任何变体(例如T
,T&
,T&&
,const T
,const T&
,const T&&
)
但是,似乎我的成员函数只接受rvalues,而不像接受通用引用的自由函数.
templateclass Foo{ public: void memberURef(T&& t){ val = std::forward (t); } private: T val; }; template void freeURef(T&& t){ } int main() { int lval = 1; const int clval = 1; freeURef(lval); // fine freeURef(clval); // fine Foo foo; foo.memberURef(2); foo.memberURef(lval); //error: cannot bind 'int' lvalue to 'int&&' foo.memberURef(clval); //error: no matching function for call to 'Foo ::memberURef(const int&)' return 0; }
Jason Powers.. 7
在给出的代码中,Foo
实例化为Foo
.一旦发生这种情况,就会实例化类模板,如下所示:
class Foo{ public: void memberURef(int&& t){ // Uh oh! val = std::forward(t); } private: int val; };
注意成员函数不再是模板,因此不再接受通用引用,而是接受rvalue引用.为了创建一个接受通用引用的成员函数,Foo
需要按如下方式修改类:
templateclass Foo{ public: template void memberURef(L&& t){ val = std::forward (t); } private: T val; };
这样,在实例化类模板之后memberURef
仍然是一个函数模板,因此它仍然接受通用引用.
在给出的代码中,Foo
实例化为Foo
.一旦发生这种情况,就会实例化类模板,如下所示:
class Foo{ public: void memberURef(int&& t){ // Uh oh! val = std::forward(t); } private: int val; };
注意成员函数不再是模板,因此不再接受通用引用,而是接受rvalue引用.为了创建一个接受通用引用的成员函数,Foo
需要按如下方式修改类:
templateclass Foo{ public: template void memberURef(L&& t){ val = std::forward (t); } private: T val; };
这样,在实例化类模板之后memberURef
仍然是一个函数模板,因此它仍然接受通用引用.