指定返回 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/