c++11 - 错误:从“基本类型”转换为非标量类型“NamedType”' 请求
问题描述
我有以下结构(简化到足以复制问题):
template < class T, class P = struct NamedTypeDefaultTag > struct NamedType
{
//static_assert(std::is_fundamental_v< T >, "Template parameter is not a fundamental type.");
using ValueType = T;
ValueType m{};
constexpr NamedType() noexcept = default;
constexpr NamedType(const NamedType & value) noexcept = default;
constexpr NamedType(NamedType && value) noexcept = default;
constexpr explicit NamedType(const T & value) noexcept : m{value} { }
constexpr NamedType & operator = (const T & value) { m = value; return *this; }
};
然后我尝试像这样使用赋值运算符:
int main() {
using NT_t = NamedType< int >;
// generates error
int t = 1;
NT_t a = t;
const NT_t b = 2;
// works fine
NT_t c;
c = 2;
return 0;
}
我怀疑因为我声明它并同时分配它,它以某种方式尝试使用构造函数(这是显式的)。
但我不明白是什么原因造成的以及如何解决它。
解决方案
NT_t a = t;
尝试从int
到的隐式转换NT_t
。但是能够执行这种转换的构造函数被标记explicit
,因此排除了它在隐式转换中的使用。做了
NT_t a{t};
const NT_t b{2};
推荐阅读
- php - 按自定义列 WooCommerce 中的可点击值过滤产品
- reactjs - 带有 getStaticProps 和 typescript 的空对象
- c++ - Qt 线程事件循环不分派自创信号
- javascript - clearInterval "变量未定义" |
- json - Ingress-Nginx 外部身份验证的自定义响应
- oracle-apex - invoke() 方法接受哪些参数?
- amazon-web-services - 通过 OPENID 授权颁发 IAM 用户
- ssh - 无法通过新 GitLab 容器上的 ssh 密钥进行身份验证
- swift - IB中viewController上的黑屏,Xcode 12.4
- sql - 将查询从 spark.sql 转换为 impala