一台计算机中的 msvs 2013 错误 C2057,另一台计算机中没有错误。这是怎么回事?

Posted

技术标签:

【中文标题】一台计算机中的 msvs 2013 错误 C2057,另一台计算机中没有错误。这是怎么回事?【英文标题】:msvs 2013 error C2057 in one computer, no error in another. What's going on? 【发布时间】:2014-11-06 23:09:58 【问题描述】:

我有一些代码在两台机器(Windows 8.1、msvs 2013、最新更新等和 Windows 7 64 位、msvs 2013、最新更新等)中编译良好,并且相同的代码无法在另一台机器上编译(Windows 7 64 位、msvs 2013、最新更新等——是的,与其中一台工作机器相同)。所有机器都使用最新的平台工具集,项目文件与由 CMake 文件生成的相同。

我试图确定它并使最小的项目成为可能,但示例项目在有问题的机器上编译得很好。值得一提的是,下面是编译的示例,我在有问题的行中添加了注释。

#include <functional>
#include <vector>
#include <cstdint>

template<class T>
bool container_value_equal(typename T::const_reference v0, typename T::const_reference v1)  return v0 == v1; 

template<class T>
bool unordered_intersection_exists(const T& v0,
    const T& v1,
    // The below line fails in the problem computer + application!
    const std::function< bool(typename T::const_reference, typename T::const_reference)>& f = container_value_equal<T>);


int main()

    const std::vector<size_t> * vec2 = nullptr;
    std::vector<size_t> vec;
    const auto& vec_cref = vec;
    unordered_intersection_exists(vec_cref, *vec2);
    return 0;



template<class T>
bool unordered_intersection_exists(const T& vec0,
    const T& vec1,
    const std::function< bool(typename T::const_reference, typename T::const_reference)>& f)

    for (const auto& v0 : vec0)
        for (const auto& v1 : vec1)
            if (f(v0, v1))
                return true;
    return false;

上述代码块与实际调用的代码块的唯一区别是代码位于静态库中,而不是我希望它有任何区别。 为我的 ACTUAL 程序生成的错误如下:

1>E:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\type_traits(1511): error C2057: expected constant expression
1>          E:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(385) : see reference to function template instantiation '_Ty std::forward<_Fty>(remove_reference<_Fty>::type &&) throw()' being compiled
1>          with
1>          [
1>              _Ty=bool (__cdecl &)(T::const_reference,T::const_reference)
1>  ,            _Fty=bool (__cdecl &)(T::const_reference,T::const_reference)
1>          ]
1>          E:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(579) : see reference to function template instantiation 'void std::_Func_class<_Ret,const unsigned int &,const unsigned int &>::_Reset<_Fx(__cdecl &)>(_Fty)' being compiled
1>          with
1>          [
1>              _Ret=bool
1>  ,            _Fx=bool (T::const_reference,T::const_reference)
1>  ,            _Fty=bool (__cdecl &)(T::const_reference,T::const_reference)
1>          ]
1>          E:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(579) : see reference to function template instantiation 'void std::_Func_class<_Ret,const unsigned int &,const unsigned int &>::_Reset<_Fx(__cdecl &)>(_Fty)' being compiled
1>          with
1>          [
1>              _Ret=bool
1>  ,            _Fx=bool (T::const_reference,T::const_reference)
1>  ,            _Fty=bool (__cdecl &)(T::const_reference,T::const_reference)
1>          ]
1>          E:\Programming\GitHub\xxx\yyy\zzz\ddd/eee/fff.h(14) : see reference to function template instantiation 'std::function<bool (const unsigned int &,const unsigned int &)>::function<bool(T::const_reference,T::const_reference)>(_Fx (__cdecl &))' being compiled
1>          with
1>          [
1>              _Fx=bool (T::const_reference,T::const_reference)
1>          ]
1>          E:\Programming\GitHub\xxx\yyy\zzz\aaa\bbb\ccc.cpp(443) : see reference to function template instantiation 'std::function<bool (const unsigned int &,const unsigned int &)>::function<bool(T::const_reference,T::const_reference)>(_Fx (__cdecl &))' being compiled
1>          with
1>          [
1>              _Fx=bool (T::const_reference,T::const_reference)
1>          ]

【问题讨论】:

确保您的Configuration Properties -&gt; General -&gt; Platform Toolset 设置为Visual Studio 2013 谢谢,已经是了 仔细检查Property Manager(不是项目属性)中默认包含和库的顺序。这些属性会影响构建环境,并且不会由项目文件携带。您可能在一台机器和另一台机器上使用不同版本的 Windows SDK。 【参考方案1】:

不是一个很好的(自我)答案,但我通过 not 在函数“bool unordered_intersection_exists(...)”中设置默认参数解决了这个问题。

【讨论】:

以上是关于一台计算机中的 msvs 2013 错误 C2057,另一台计算机中没有错误。这是怎么回事?的主要内容,如果未能解决你的问题,请参考以下文章

在 MSVS 2013 中使用 libtorrent

MSVS 2010。如何为解决方案中的所有程序集分配相同的版本?

在 msvs 2013 中 std::shared_ptr 的 compare_exchange_weak 是不是损坏?

你如何控制 Gradle 使用的 (MSVS) VC lib 目录?

在 cpp 文件中使用内联命名空间中的类型在 MSVS 中不起作用

MSVS 链接器在静态 const 字符串之间添加数据