gpt4 book ai didi

c++ - 使用模板 : Operator resolved first or conversion resolved first?

转载 作者:搜寻专家 更新时间:2023-10-31 00:45:56 27 4
gpt4 key购买 nike

我昨天看到了一些有趣的编译器行为,我想我明白为什么会这样,但我想确定一下。所以,我不会写我的推理,只写事实。

请注意,我使用 vector 而不是 string 并不是错字。我是故意这样做的,这样编译器就无法理解 std::string 是什么,因此它必须四处搜索以找出 + 我指的是哪个运算符:

#include <vector>
// #include <string> // intentionally commented out

template <typename T> struct A
{
A() { };
~A() { };

int m_member;
};

template <typename T> A<T> operator+(double lhs, const A<T> &rhs);

int main(int argc, char **argv)
{
std::string fullString = std::string("Hi ") + std::string("mom!");
}

因此,我在 MS Visual Studio 2005 中遇到了大量编译器错误。我只展示了其中的一部分。

1>.\test.cpp(21) : error C2784: 'A<T> operator +(double,const A<T> &)' : could not deduce template argument for 'const A<T> &' from 'std::basic_string<_Elem,_Traits,_Ax>'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> .\test.cpp(16) : see declaration of 'operator +'

...错误继续...

1>.\test.cpp(21) : error C2784: 'std::_Vb_iterator<_MycontTy> std::operator +(_Vb_iterator<_MycontTy>::difference_type,std::_Vb_iterator<_MycontTy>)' : could not deduce template argument for 'std::_Vb_iterator<_MycontTy>' from 'std::basic_string<_Elem,_Traits,_Ax>'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\vector(1800) : see declaration of 'std::operator +'

...错误继续...

1>.\test.cpp(21) : error C2784: 'std::_Vb_const_iterator<_MycontTy> std::operator +(_Vb_const_iterator<_MycontTy>::difference_type,std::_Vb_const_iterator<_MycontTy>)' : could not deduce template argument for 'std::_Vb_const_iterator<_MycontTy>' from 'std::basic_string<_Elem,_Traits,_Ax>'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\vector(1695) : see declaration of 'std::operator +'

...错误继续...

1>.\test.cpp(21) : error C2784: 'std::_Vector_iterator<_Ty,_Alloc> std::operator +(_Vector_iterator<_Ty,_Alloc>::difference_type,std::_Vector_iterator<_Ty,_Alloc>)' : could not deduce template argument for 'std::_Vector_iterator<_Ty,_Alloc>' from 'std::basic_string<_Elem,_Traits,_Ax>'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\vector(396) : see declaration of 'std::operator +'

...错误继续...

1>.\test.cpp(21) : error C2784: 'std::_Vector_const_iterator<_Ty,_Alloc> std::operator +(_Vector_const_iterator<_Ty,_Alloc>::difference_type,std::_Vector_const_iterator<_Ty,_Alloc>)' : could not deduce template argument for 'std::_Vector_const_iterator<_Ty,_Alloc>' from 'std::basic_string<_Elem,_Traits,_Ax>'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\vector(264) : see declaration of 'std::operator +'

因此,编译器四处搜索 + 的含义,并提示它无法推断出适当的模板参数。我对两个相关的事情感到惊讶,一个 是它为涉及模板的每个重载 + 运算符给出此错误。这告诉我编译器绝对没有办法排除这些 + 中的任何一个都没有意义; 两个,这是相关的,它不只是提示没有合适的运营商存在。

我认为这是一个了解模板如何实例化和编译的机会。有没有人有任何好的解释或引用?

最佳答案

事实上,由于找不到匹配项,它正在使用错误告诉您它实际找到的可能 运算符候选。

例如,g++ 错误告诉您它找不到运算符,然后提供相同的一系列消息,但以“候选者是:”的形式而不是每个运算符一个错误。

它这样做是为了提供帮助:因为它找不到匹配项,所以它假设您实际上可能指的是任何可能的可用运算符。

关于c++ - 使用模板 : Operator resolved first or conversion resolved first?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5822366/

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