0

指定返回向量的转换运算符会导致错误 C2664。

void foo(const std::vector<std::wstring>& s)
{
}

class Wrapper
{
public:
    Wrapper(const std::vector<std::wstring>& s) : m_s(s)
    {
    }
    operator std::vector<std::wstring>() const
    {
        return m_s;
    }
private:
    const std::vector<std::wstring> m_s;
};

Wrapper wrapper(std::vector<std::wstring>());
foo(wrapper);
foo(static_cast<std::vector<std::wstring>>(wrapper));

我得到:

error C2664: '`anonymous-namespace'::foo' : cannot convert parameter 1 from '`anonymous-namespace'::Wrapper (__cdecl *)(std::vector<_Ty> (__cdecl *)(void))' to 'const std::vector<_Ty> &'
with
[
  _Ty=std::wstring
]
Reason: cannot convert from 'overloaded-function' to 'const std::vector<_Ty>'
with
[
  _Ty=std::wstring
]
No constructor could take the source type, or constructor overload resolution was ambiguous

带有 wstring 的相同代码确实有效:

void foo(const std::wstring& s)
{
}

class Wrapper
{
public:
    Wrapper(const std::wstring& s) : m_s(s)
    {
    }
    operator std::wstring() const
    {
        return m_s;
    }
private:
    const std::wstring m_s;
};

Wrapper wrapper(std::wstring(L"test"));
foo(wrapper);

这是 Visual Studio 编译器中的错误还是容器在这里有什么特别之处?

4

2 回答 2

6

大多数 Vexing Parse -wrapper被声明为函数而不是对象。

具体来说,它是一个返回 的函数Wrapper,并接受一个指向返回std::vector<std::wstring>且不带参数的函数的指针。

构造函数参数L"test"在你的代码中避免了这种情况wstring,因为它不能是函数声明的一部分,所以声明是一个对象定义。在这种特殊情况下,对代码的最简单修复可能是0作为构造函数参数传递给向量,而不是不传递任何参数。

于 2013-01-03T13:12:56.457 回答
1

只需更改行:

Wrapper wrapper(std::vector<std::wstring>());

进入:

std::vector<std::wstring> v;
Wrapper wrapper(v);

您的原始声明wrapper被解析为一个函数的声明,该函数返回一个类型的对象Wrapper并在输入中接受一个返回 anstd::vector<std::wstring>且不带参数的函数。

于 2013-01-03T13:17:25.937 回答