' 请求,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;
}

我怀疑因为我声明它并同时分配它,它以某种方式尝试使用构造函数(这是显式的)。

但我不明白是什么原因造成的以及如何解决它。

标签: c++11

解决方案


NT_t a = t;尝试从int到的隐式转换NT_t。但是能够执行这种转换的构造函数被标记explicit,因此排除了它在隐式转换中的使用。做了

NT_t a{t};
const NT_t b{2};

推荐阅读