gpt4 book ai didi

c++ - STL operator= Visual Studio 2010 的行为发生变化?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:25:52 25 4
gpt4 key购买 nike

我正在尝试使用 Visual Studio 2010 (C++) 编译 QtScriptGenerator ( gitorious ),但遇到了编译错误。在寻找解决方案的过程中,我偶尔会看到自 VS2008 以来由于 VS2010 的 STL 实现的变化和/或 c++0x 一致性变化而引入的编译破损。

知道下面发生了什么,或者我该如何解决它?如果有问题的代码似乎是 QtScriptGenerator 的,我想我会更容易修复它。但在我看来,有问题的代码可能在 VS2010 的 STL 实现中,我可能需要创建一个解决方法?

附言。我对模板和 STL 很陌生。我有嵌入式和控制台项目的背景,这些项目直到最近才经常被避免以减少内存消耗和交叉编译器风险。

编辑 - 看起来可能是 Visual Studio 对 std::copy 的实现发生了变化。

    C:\Program Files\Microsoft Visual Studio 10.0\VC\INCLUDE\xutility(275) : error C2679: binary '=' : no operator found which takes a right-hand operand of type 'rpp::pp_output_iterator<_Container>' (or there is no acceptable conversion)
with
[
_Container=std::string
]
c:\qt\qtscriptgenerator\generator\parser\rpp\pp-iterator.h(75): could be 'rpp::pp_output_iterator<_Container> &rpp::pp_output_iterator<_Container>::operator =(const char &)'
with
[
_Container=std::string
]
while trying to match the argument list '(rpp::pp_output_iterator<_Container>, rpp::pp_output_iterator<_Container>)'
with
[
_Container=std::string
]
C:\Program Files\Microsoft Visual Studio 10.0\VC\INCLUDE\xutility(2176) : see reference to function template instantiation '_Iter &std::_Rechecked<_OutIt,_OutIt>(_Iter &,_UIter)' being compiled
with
[
_Iter=rpp::pp_output_iterator<std::string>,
_OutIt=rpp::pp_output_iterator<std::string>,
_UIter=rpp::pp_output_iterator<std::string>
]
c:\qt\qtscriptgenerator\generator\parser\rpp\pp-internal.h(83) : see reference to function template instantiation '_OutIt std::copy<std::_String_iterator<_Elem,_Traits,_Alloc>,_OutputIterator>(_InIt,_InIt,_OutIt)' being compiled
with
[
_OutIt=rpp::pp_output_iterator<std::string>,
_Elem=char,
_Traits=std::char_traits<char>,
_Alloc=std::allocator<char>,
_OutputIterator=rpp::pp_output_iterator<std::string>,
_InIt=std::_String_iterator<char,std::char_traits<char>,std::allocator<char>>
]
c:\qt\qtscriptgenerator\generator\parser\rpp\pp-engine-bits.h(500) : see reference to function template instantiation 'void rpp::_PP_internal::output_line<_OutputIterator>(const std::string &,int,_OutputIterator)' being compiled
with
[
_OutputIterator=rpp::pp_output_iterator<std::string>
]
C:\Program Files\Microsoft Visual Studio 10.0\VC\INCLUDE\xutility(275) : error C2582: 'operator =' function is unavailable in 'rpp::pp_output_iterator<_Container>'
with
[
_Container=std::string
]

这里有一些背景......

pp-internal.h

#ifndef PP_INTERNAL_H
#define PP_INTERNAL_H

#include <algorithm>
#include <stdio.h>
namespace rpp {

namespace _PP_internal
{
..
64 template <typename _OutputIterator>
65 void output_line(const std::string &__filename, int __line, _OutputIterator __result)
66 {
67 std::string __msg;
68
69 __msg += "# ";
70
71 char __line_descr[16];
72 pp_snprintf (__line_descr, 16, "%d", __line);
73 __msg += __line_descr;
74
75 __msg += " \"";
76
77 if (__filename.empty ())
78 __msg += "<internal>";
79 else
80 __msg += __filename;
81
82 __msg += "\"\n";
83 std::copy (__msg.begin (), __msg.end (), __result);
84 }

pp-engine-bits.h

#ifndef PP_ENGINE_BITS_H
#define PP_ENGINE_BITS_H

#include <stdio.h>

namespace rpp {

450 template <typename _InputIterator, typename _OutputIterator>
451 void pp::operator () (_InputIterator __first, _InputIterator __last, _OutputIterator __result)
452 {
..
497 if (env.current_line != was)
498 {
499 env.current_line = was;
500 _PP_internal::output_line (env.current_file, env.current_line, __result);
501 }

.. 这是 pp_output_iterator

的定义

pp迭代器.h

#ifndef PP_ITERATOR_H
#define PP_ITERATOR_H

#include <iterator>

namespace rpp {
..
template <typename _Container>
class pp_output_iterator
: public std::iterator<std::output_iterator_tag, void, void, void, void>
{
std::string &_M_result;

public:
explicit pp_output_iterator(std::string &__result):
_M_result (__result) {}

inline pp_output_iterator &operator=(typename _Container::const_reference __v)
{
if (_M_result.capacity () == _M_result.size ())
_M_result.reserve (_M_result.capacity () << 2);

_M_result.push_back(__v);
return *this;
}

inline pp_output_iterator &operator * () { return *this; }
inline pp_output_iterator &operator ++ () { return *this; }
inline pp_output_iterator operator ++ (int) { return *this; }
};

最佳答案

我认为问题在于 std::copy正在尝试在您的 operator=() 上使用“复制分配”(rpp::pp_output_iterator<>)并且没有 operator=()对于那个类模板。我应该说,有一个 operator=()但它没有采用正确的参数作为“复制赋值”函数(即,它不采用 ``rpp::pp_output_iterator<>& parameter). I think that the existence of some operator=()` 函数将阻止编译器生成一个默认值(我目前无法访问标准文档来 100% 验证这一点)。

请注意,一个类型必须是可赋值的(当然,除其他事项外)才能被视为 OutputIterator:http://www.sgi.com/tech/stl/OutputIterator.html

以前版本的 std::copy在 MSVC 中可能实际上没有使用赋值(仅仅因为 OutputIterator 必须支持它并不意味着 std::copy 必须使用它),这就是为什么它可能是 VS2010 中的"new"错误。 (由于我的工具访问受限,我现在无法检查)。

关于c++ - STL operator= Visual Studio 2010 的行为发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2791525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com