как указать NULL в качестве аргумента типа указателя на функцию шаблона - PullRequest
4 голосов
/ 04 января 2011

Это показывает суть этого:

#include <utility>

class A {
public:
    A() { }
};

class B {
public:
    B() { }
};

typedef std::pair<A*, B*> ABPair;

int main(int argc, char* argv[])
{
    B* b = 0;               // no C2440
    ABPair p2(new A(), b);

    ABPair p1(new A(), 0);  // C2440

    return 0;
}

Есть ли лучший способ заставить объявление p1 работать, чем просто принудительное приведение, например ABPair p1(new A(), (B*)NULL)? Похоже, это было бы довольно распространенным явлением, и что был бы «правильный» способ сделать это ... и что его наложение не является правильным.

На VS 2010 полная ошибка:

1>ClCompile:
1>  test.cpp
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(163): error C2440: 'initializing' : cannot convert from 'int' to 'B *'
1>          Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(247) : see reference to function template instantiation 'std::_Pair_base<_Ty1,_Ty2>::_Pair_base<_Ty,int>(_Other1 &&,_Other2 &&)' being compiled
1>          with
1>          [
1>              _Ty1=A *,
1>              _Ty2=B *,
1>              _Ty=A *,
1>              _Other1=A *,
1>              _Other2=int
1>          ]
1>          c:\users\charliearnold\documents\visual studio 2010\projects\test\test\test.cpp(20) : see reference to function template instantiation 'std::pair<_Ty1,_Ty2>::pair<A*,int>(_Other1 &&,_Other2 &&)' being compiled
1>          with
1>          [
1>              _Ty1=A *,
1>              _Ty2=B *,
1>              _Other1=A *,
1>              _Other2=int
1>          ]
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(163): error C2439: 'std::_Pair_base<_Ty1,_Ty2>::second' : member could not be initialized
1>          with
1>          [
1>              _Ty1=A *,
1>              _Ty2=B *
1>          ]
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(167) : see declaration of 'std::_Pair_base<_Ty1,_Ty2>::second'
1>          with
1>          [
1>              _Ty1=A *,
1>              _Ty2=B *
1>          ]
1>
1>Build FAILED.

Ответы [ 2 ]

11 голосов
/ 04 января 2011

Не совсем.nullptr исправит это в C ++ 0x, но сейчас напишите (B*)0.

5 голосов
/ 04 января 2011

Вы можете использовать шаблон 'make_xxx()':

#include <utility>

class A {
public:
    A() { }
};

class B {
public:
    B() { }
};

typedef std::pair<A*, B*> ABPair;

ABPair make_ABPair(A* pa, B* pb) 
{
    return ABPair(pa, pb);
}


int main(int argc, char* argv[])
{
    B* b = 0;               // no C2440
    ABPair p2(new A(), b);

    //ABPair p1(new A(), 0);  // C2440
    ABPair p1(make_ABPair(new A(), 0));

    return 0;
}

Это позволит вам передавать не только 0, но и все, что неявно преобразуется в A* или B*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...