没有用于使用引用参数调用构造函数的匹配函数

时间:2014-11-27 16:32:17

标签: c++ templates

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

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

我很想知道为什么模板化的类的行为与普通类的行为不同。

2 个答案:

答案 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));