如何摆脱不兼容的 c++ 转换

How to get rid of incompatible c++ conversion

提问人:felipe 提问时间:4/12/2022 更新时间:4/12/2022 访问量:59

问:

我在编译过程中收到以下错误:

Severity    Code    Description Project File    Line    Suppression State
Error   C2664   'mytest::Test::Test(const mytest::Test &)': cannot convert argument 1 from '_Ty' to 'const mytest::Test &'  TotalTest   C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\include\xutility    158

我不知道是什么,所以我把代码放在这里来举例说明正在做的事情:

总测试 .cpp

include <iostream>

#include "Test.h"

using namespace mytest;

int main()
{
    std::cout << "Hello World!\n";

    new Test();
}

测试.h

#pragma once
#include "Test.h"
#include <iostream>

namespace mytest
{
    using namespace std;

    class Test
    {
    public:
        Test();
        ~Test();

        shared_ptr<Test> t;

    };
}

测试 .cpp

#include "Test.h"

namespace mytest
{

    Test::Test()
    {
    }

    Test::~Test()
    {
    }

}

TestFactory.h

#pragma once

#include "Test.h"
#include <iostream>

namespace mytest
{
    using namespace std;

    class TestFactory
    {
    public:
        TestFactory();

        shared_ptr<Test> CreateTest(int testClass);
    };

}

测试工厂:.cpp

#include "TestFactory.h"

namespace mytest 
{
    TestFactory::TestFactory()
    {
    }

    shared_ptr<Test> TestFactory::CreateTest(int testClass)
    {
        return make_shared<Test>(new Test());
    }
}

我正在使用 Visual Studio C++ 语言标准:ISO C++14 标准 (/std:c++14)

C++ STL 命名空间 std

评论

2赞 Taekahn 4/12/2022
删除new test()
0赞 Remy Lebeau 4/12/2022
@Taekahn in 当然是一个错误(运行时的内存泄漏),但它不是编译器错误的原因。new Test()main()
0赞 Taekahn 4/12/2022
@RemyLebeau这是一个错误 In Make_shared因为他正在调用一个不存在的复制构造函数
0赞 Remy Lebeau 4/12/2022
@Taekahn我知道,这就是为什么我说了这么多
1赞 Taekahn 4/12/2022
@RemyLebeau老实说,我没有注意到主要有一个。我在用一个小电话。

答:

3赞 Remy Lebeau 4/12/2022 #1

在 中,是错误的,因为没有接受指针作为输入的构造函数。TestFactory::CreateTest()make_shared<Test>(new Test())TestTest*

您需要改用,让调用默认构造函数:make_shared<Test>()make_shared()Test()

shared_ptr<Test> TestFactory::CreateTest(int testClass)
{
    return make_shared<Test>();
}

传递到的任何参数都将传递给模板参数中指定的类型的构造函数。在这种情况下,不需要任何参数。make_shared()

1赞 wohlstad 4/12/2022 #2

错误来自以下行:

return make_shared<Test>(new Test());

有 2 种方法可以初始化:std::shared_ptr

  1. 直接使用构造函数,这需要你传递一个已经在堆上分配的对象,例如:std::shared_ptrTest

     std::shared_ptr<Test> p{ new Test() };
    
  2. 使用 ,它在内部执行堆分配,例如:make_shared()

     std::shared_ptr<Test> p{ std::make_shared<Test>() };
    

    在括号中,您可以将参数传递给 的构造函数。Test

第二种选择通常是首选。您可以在此处查看更多信息:make_shared和正常shared_ptr C++的差异

另外:

  1. Test.h不应包括自身(它位于顶部)。#include "Test.h"

  2. 应避免使用 .更多信息在这里:为什么“使用命名空间 std;”被认为是不良做法?using namespace std;