在下面的示例中,我有两个相同的类,除了第一个使用模板。
template <typename T>
class Container {
const T t;
public:
Container(const T _t): t(_t) { }
const T get() {
return t;
}
};
class PersonContainer {
const Person& p;
public:
PersonContainer(const Person& _p): p(_p) { }
const Person& get() {
return p;
}
};
这里提到的Person
类:
struct Person {
int age;
Person(int _age): age(_age) {};
};
当我将rValue传递给期望lValue的函数时,它在非模板类的构造函数中工作正常(因为它是一个常量参数)。但是,对于模板化的类,它会失败:
int main() {
PersonContainer personContainer(Person(50)); // works fine
Container<Person&> container(Person(50)); // error
cout << personContainer.get().age;
cout << container.get().age;
return 0;
}
我得到的错误信息是:
no matching function for call to ‘Container<Person&>::Container(Person)’
我很想知道为什么模板化的类的行为与普通类的行为不同。
答案 0 :(得分:1)
问题是const如何绑定到T.
最终结果是对T的const引用。默认情况下,引用是const,因此没有区别。这意味着你的构造函数期望T&amp;临时无法绑定的(请参阅您的其他问题)。 您期望的是对const T的引用。
T = Person&
(const T == Person& const == Person&) != const Person&
我希望这是有道理的。
作为对其他答案的评论的回复,您只需将Person
作为模板参数,并使get
函数返回const T&
。
此外,存储引用可能是危险的,因为您的&#34;容器&#34;可能比参考点所指向的实际对象寿命更长。
答案 1 :(得分:0)
Container<Person&> container(Person(50));
你应该删除&amp;从类型中你传递给模板,因为它在这种情况下是无关紧要的。
Container<Person> container(Person(50));