【问题标题】:C++ value_type::second_type compiler error inside template模板内的 C++ value_type::second_type 编译器错误
【发布时间】:2021-09-12 05:45:51
【问题描述】:

在模板函数中使用 decltype 时出现编译器错误。示例非常不言自明。帮忙?

template<class T>
void foo(T&& m)
{
    auto t = (decltype(m)::value_type::second_type::value_type*)3; // compiler error
}

int main()
{
    unordered_map<int, map<float, double>> m;
    foo(m);
    auto t = (decltype(m)::value_type::second_type::value_type*)3; // ok, t is a std::pair<const float, double>*
}

【问题讨论】:

    标签: c++ templates decltype


    【解决方案1】:

    如果在函数中使用m,需要去掉引用(并添加typename):

    例子:

    typename std::remove_reference_t<decltype(m)>::value_type::second_type::value_type* t;
    

    或者干脆使用T:

    typename T::value_type::second_type::value_type* t;
    

    【讨论】:

    • 谢谢!第一个解决方案有效,但第二个由于某种原因没有
    • @user14789259 太好了。不客气!奇怪的是,第二个没有用。请注意,类型是std::pair&lt;const float, double&gt;*,而不是您作为评论写的std::pair&lt;const float*, double&gt;*
    • 真的!我会解决的
    • 我还建议不要将3 转换为decltype(m)::value_type::second_type::value_type*。这看起来有风险。
    • 是的,这只是示例的随机数 :)
    猜你喜欢
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    相关资源
    最近更新 更多