对类型的非常量左值引用无法绑定错误

Posted

技术标签:

【中文标题】对类型的非常量左值引用无法绑定错误【英文标题】:non-const lvalue reference to type cannot bind error 【发布时间】:2013-08-05 16:26:49 【问题描述】:

我正在尝试创建一个非常简单的 VCard,但我在 main.cpp 中获得了对 type 的非 const 左值引用无法绑定错误并且无法解决这个问题。问题是.....

vc->createVCard("JasonSteindorf.vcf", &p1);

//Person.h

#ifndef JASONSTEINDORF_PERSON_H
#define JASONSTEINDORF_PERSON_H

#include <string>
using std::string;

namespace JasonSteindorf

    class Person
    public:
        Person();
        Person(string firstName,string lastName,string phoneNumber,string email)
            : firstName(firstName), lastName(lastName), phoneNumber(phoneNumber), email(email)

        inline string getFirstName() return firstName; 
        inline string getLastName() return lastName; 
        inline string getPhoneNumber() return phoneNumber; 
        inline string getEmail() return email; 

    private:
        string firstName, lastName, phoneNumber, email;
    ;


#endif

//VCard.h

#ifndef JASONSTEINDORF_VCARD_H
#define JASONSTEINDORF_VCARD_H


#include "Person.h"

#include <string>
using std::string;

namespace JasonSteindorf

    class VCard

    public:
        void createVCard(string fileName, Person &p);
        string getVCard(Person &p);
    ;


#endif 

//VCard.cpp

#include "VCard.h"

#include <fstream>
using std::ofstream;

#include <string>
using std::string;

#include <sstream>
#include <iostream>
using std::ostringstream;


using namespace JasonSteindorf;

//Writes the VCard to a file
string getVCard(Person &p)
    ostringstream os;

    os << "BEGIN:VCARD\n"
       << "VERSION:3.0\n"
       << "N:" << p.getLastName() << ";" << p.getFirstName() << "\n"
       << "FN:" << p.getFirstName() <<" " << p.getLastName() << "\n"
       << "TEL:TYPE=CELL:" << p.getPhoneNumber() << "\n"
       << "EMAIL:" << p.getEmail() << "\n"
       << "URL:" << "http://sorcerer.ucsd.edu/html/people/jason.html" << "\n"
       << "REV:20110719T195243Z" << "\n"
       << "END:VCARD\n";

    return os.str();


//Returns a string containing the VCard format
void createVCard(string fileName, Person &p)
    string vCard = getVCard(p);

    ofstream outputFile("/Users/jsteindorf/Desktop/" + fileName);
    outputFile << vCard;

//main.cpp

#include "Person.h"
#include "VCard.h"

#include <iostream>

using namespace JasonSteindorf;

int main(int argc, const char * argv[])


    VCard *vc = new VCard();
    Person *p1 = new Person ("Jason", "S", "858-555-5555", "js@ucsd.edu");

    vc->createVCard("JS.vcf", &p1);

    return 0;

【问题讨论】:

在两个地方使用 const Person &。 其他建议,从您的 getter 中返回 const string& 以防止复制。 【参考方案1】:

您尚未将函数 createVCardgetCard 定义为 VCard 类的成员函数。

这些是全局函数。使用范围解析运算符:: 将它们定义为类的成员函数,如

  void Vcard::createVCard(string fileName,Person &p)
  
    ....
    ....
  
  string Vcard::getVCard(Person &p)
  
    ....
    ....
  

而且您的createVCard 函数也接受对Person 的引用,因此您必须将对象传递给人,而不是对象(&amp;p) 的指针地址或对象(p) 的地址,而是传递通过像*p 一样取消引用对象,因此调用看起来像vc-&gt;createVCard("JS.vcf", *p1)

【讨论】:

以上是关于对类型的非常量左值引用无法绑定错误的主要内容,如果未能解决你的问题,请参考以下文章

允许将右值绑定到非常量左值引用吗?

模板中右值的类型推导

非常量左值引用的示例

对“const int *”类型的非 const 左值引用不能绑定到不相关类型“int *”的值

error C2662 无法将左值绑定到右值 —— 变量永远是左值,即使它的类型为右值引用

错误:对类型为'const ItemInstance'的引用无法绑定到类型为'void'的右值