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

How to get rid of incompatible c++ conversion

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

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 Studio19\Community\VC\Tools\MSVC.29.30037\include\xutility    158

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

TotalTest.cpp

include <iostream>

#include "Test.h"

using namespace mytest;

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

    new Test();
}

Test.h

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

namespace mytest
{
    using namespace std;

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

        shared_ptr<Test> t;

    };
}

Test.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);
    };

}

TestFactory.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)

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

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

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

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

错误来自以下行:

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

有两种初始化方式 std::shared_ptr:

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

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

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

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

通常首选第二个选项。您可以在此处查看更多信息:Difference in make_shared and normal shared_ptr in C++

另外:

  1. Test.h 不应包含自身(它在顶部有 #include "Test.h")。

  2. 您应该避免使用 using namespace std;。更多信息在这里:Why is "using namespace std;" considered bad practice?