我正在为 Boost Socket 编写包装器。我们有一个使用 Boost 套接字的类,但我们需要包装它以便我们可以模拟它以便我们可以从它伪造回调以进行单元测试。这与此无关。
我编写了包装器,创造性地称为 BoostSocketWrapper
,并为我们使用的套接字端点创建了端点。包装器保存真实套接字的实例,并将调用传递到真实套接字。但是因为所有函数都是虚拟的,我们可以覆盖它们并使用 Google Mock 模拟它们。
我已准备好所有端点,但一旦我写完最后一个端点,我就遇到了一个新错误。 g++ 声称它找不到包装器的构造函数。如果我删除其中一个必要的端点,它不会提示,我只能假设这是因为它检测到其他错误,甚至还没有尝试构建它。
由于这是 C++11,我们为该类使用一个唯一的指针。创建它的调用并没有什么特别之处:
theSocket = make_unique<BoostSocketWrapper>(ioService);
出于不完全清楚的原因,我们定义了我们自己的 make_unique()
版本,但我知道 make_unique()
直到 C+ 才在 C++ 中定义+14。它在代码中的其他数百个地方使用:
template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
ioService
是一个传入值,当它就位时,它可以完美地用于原始 Boost 套接字。它被定义为 boost::asio::io_service
。包装器中的构造函数端点与 Boost 相同:
class BoostSocketWrapper {
public:
/**
* @brief Constructor that creates the Boost Socket
*
* @param ioService
*/
BoostSocketWrapper(boost::asio::io_service& ioService);
virtual ~BoostSocketWrapper() {}
...
}
但是 g++ 它声称找不到它:
undefined reference to `speca::BoostSocketWrapper::BoostSocketWrapper(boost::asio::io_context&)'
我也尝试过只使用 std::unique_ptr,但会出现同样的错误。
我一整天都在为此苦苦思索,但无济于事。这里的其他 C++ 编码人员也不理解它。这是 BoostSocketWrapper
声明的要点, header 包含在我尝试分配它的文件中:
#pragma once
#include <boost/asio.hpp>
namespace sprocketa {
class BoostSocketWrapper {
public:
BoostSocketWrapper(boost::asio::io_service& ioService);
virtual ~BoostSocketWrapper() {}
virtual void open( const boost::asio::ip::basic_endpoint<boost::asio::ip::udp>::protocol_type & protocol );
...
private:
// this constructs fine in the implementation
std::unique_ptr<boost::asio::ip::udp::socket> theSocket = nullptr;
}
} // namespace sprocketa
我们尝试从中分配它的类在同一个命名空间中。我们使用带有 g++ 的 C++11 和 Eclipse CDT 作为 IDE。
我在这里错过了什么?
最佳答案
它说:不匹配调用 ...::unique_ptr(boost::asio::io_service&)
.这意味着您正在传递 boost::asio::io_service&
到 unique_ptr 构造函数而不是 T
构造函数(应该是 BoostSocketWrapper
)。
以下最小示例不会重现问题,因此您显然在代码的其他地方尝试初始化 unique_ptr<>
来自 io_service&
引用而不是使用 make_unique
. (请注意,复制构造函数也可能从赋值语句或返回语句中调用,因此请寻找意外来源)。
#include <boost/asio.hpp>
#include <memory>
boost::asio::io_service ioService;
namespace sprocketa {
class BoostSocketWrapper {
public:
BoostSocketWrapper(boost::asio::io_service&) {}
virtual ~BoostSocketWrapper() {}
virtual void open(const boost::asio::ip::basic_endpoint<boost::asio::ip::udp>::protocol_type&) {}
private:
// this constructs fine in the implementation
std::unique_ptr<boost::asio::ip::udp::socket> theSocket = nullptr;
};
template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
void foo() {
auto theSocket = make_unique<BoostSocketWrapper>(ioService);
}
} // namespace sprocketa
int main() {
sprocketa::foo();
}
关于c++ - 已定义构造函数的无法识别的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51485520/