c++ - std::vector 转换运算符的 C2664

标签 c++ visual-studio-2010 casting

指定返回 vector 的转换运算符会导致错误 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 编译器中的错误还是这里的容器有什么特殊之处?

最佳答案

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

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

构造函数参数L"test"使用 wstring 在您的代码中避免这种情况,因为它不能是函数声明的一部分,所以声明是一个对象定义。在这种特殊情况下,对您的代码最简单的修复可能是通过 0作为 vector 的构造函数参数而不是无参数。

关于c++ - std::vector 转换运算符的 C2664,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14139608/

相关文章:

c++ - 使用 openCV 编写视频 - 没有为轨道 0 设置关键帧

c++ - 私有(private)和 protected 纯虚函数之间有什么区别吗?

c++ - `__declspec(align(#))` 是如何工作的?

java - 为什么你可以在不进行类型转换的情况下将 long 存储到 float 中

java - 将泛型类型 T 转换为 Class<T>

javascript - 如何直接从原生 JavaScript 前端与 Emscripten Web Worker 交互

c++ - 泛型在 C++/CX 中的工作原理

c++ - VS2010插件cpp/h自动标签组

c++ - OpenCV getMinFilter_GPU

c# - 当 B 可以类型转换为 A 时,如何将 A 转换为对象 A 类?