2
public:
    string str;

    Test(string& str){
        this->str=str;
        cout<<"constructor"<<endl;
    }
 

};

int main() {
    Test t="test";
    return 0;
}

在这段代码中我得到错误"..\src\Test.cpp:30:9: error: conversion from 'const char [5]' to non-scalar type 'Test' requested "

那么为什么下面的代码可以呢?

#include <iostream>
using namespace std;

class Test{

public:
    string str;

    Test(string str){
        this->str=str;
        cout<<"constructor"<<endl;
    }

    Test(const Test &test){
        cout<<"copy constructor"<<endl;
        this->str=test.str;
    }

};

int main() {
    Test t=Test("test");
    return 0;
}
4

4 回答 4

8
Test t="test";

这试图:

  • 将字符串文字(它是一个字符数组char[5])转换为临时string
  • 将临时转换stringTest

这失败有两个原因:

  • 隐式转换序列不能涉及多个用户定义的转换。这里需要两个。
  • 临时不能绑定到非 const左值引用,这是您的转换构造函数Test(string&)想要的。

您的第二个示例通过以下方式解决了这些问题:

  • 进行从stringTest显式的转换,Test(...). 现在只有一个隐式转换, from char[5]to string。请注意,这是一种相当冗长的初始化方式;Test t("test")会做同样的事情。
  • 声明转换构造函数string按值获取,而不是引用。一个 const 引用 ,const string&也可以工作,一个const char*.

这两个更改都是必要的,因为每个更改都只解决了两个问题中的一个。

于 2013-04-27T13:18:59.717 回答
2

您只允许在用户定义的类型之间进行一次隐式转换。您的代码具有从const char[6](衰减到const char*)到std::string和从std::string到的隐式转换Test。这就是将签名更改为Test(const std::string&) 不起作用的原因。

尝试将构造函数签名更改为

#include <string>

struct Test
{
  Test(const char* c) : s_(c) {}
  std::string s_;
};

int main()
{
  Test t = "Hello";
}
于 2013-04-27T13:09:56.577 回答
0

测试 t="测试"; 编译器会尝试找到一个构造函数:Test(const char*),但你只是定义了一个 Test(string&),所以它会弹出错误。

您可以尝试定义一个构造函数,例如 Test(const char*) 或像这样修改您的代码:Test t = string("test")

于 2013-04-27T13:32:23.660 回答
0

只需将 aconst接受"test"为常量字面量即可:

Test(const string& str) : str(str) {
     ^^^^^
}

并像使用它一样

Test t("test");

or

Test t = string("test");

实时代码

于 2013-04-27T13:09:18.623 回答