gpt4 book ai didi

c++ - 没有匹配函数来调用带有引用参数的构造函数

转载 作者:太空狗 更新时间:2023-10-29 23:02:53 27 4
gpt4 key购买 nike

在下面的示例中,我有两个相同的类,除了第一个使用模板。

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)’

我很想知道为什么模板类的行为方式与常规类不同。

最佳答案

问题是 const 如何绑定(bind)到 T。

它最终得到的是对 T 的 const 引用。默认情况下,引用是 const,因此没有区别。这意味着您的构造函数需要一个临时无法绑定(bind)的 T& (请参阅您的其他问题)。您期望的是对 const T 的引用。

T = Person&
(const T == Person& const == Person&) != const Person&

我希望这是有道理的。

作为对您对其他答案的评论的回复,您应该简单地将 Person 作为模板参数并使您的 get 函数返回 const T&.

此外,存储引用可能是危险的,因为您的“容器”可能比引用所指向的实际对象生命周期更长。

关于c++ - 没有匹配函数来调用带有引用参数的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27175222/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com