cerco un'implementazione ufficiale di nullptrTroubles in attuazione nullptr su VS2013
so che con nullptr e std :: nullptr_t supportato da compilatori, questa implementazione è meaningless.I sto solo cercando di studiare C++.
e tutto funziona correttamente con GCC4.9.1 sul mio PC, sia -std = C++ 03 e -std = C++ 11, anche con successo online @ ideone.com GCC4.3.2.
ma in linea di VS2013 125 va error2440, conversione non è riuscita
error C2440: "initialize": cannot convert "const <unnamed-type-my_nullptr>" to "int (__thiscall Test::*)(void) const" in line125
>
#include <iostream>
#include <cassert>
// The Official proposal
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf
const // this is a const object...
class {
public:
template<class T> // convertible to any type
operator T*() const // of null non-member
{
return 0;
} // pointer...
template<class C, class T> // or any type of null
operator T C::*() const // member pointer...
{
return 0;
}
private:
void operator&() const; // whose address can't be taken
} my_nullptr = {}; // and whose name is nullptr
struct Test123 {
int ABCD, ABC, AB;
int A;
int BA, CBA, DCBA;
struct XYZ {
char X, Y, Z, W;
};
struct {
int B, C, D;
};
} test123;
class Test {
int ABCD;
public:
void method(void){}
Test(int val) :ABCD(val){}
int getABCD(void) const { return ABCD; }
int get2ABCD(void) const { return ABCD * 2; }
int get3ABCD(void) const { return ABCD * 3; }
} test(0123);
int main(int argc, char* argv[])
{
// TEST_my_nullptr
{
int a = 321, *p = my_nullptr;
assert(p == my_nullptr);
assert(my_nullptr == p);
p = &a; *p = 0123;
assert(p != my_nullptr);
assert(my_nullptr != p);
p = my_nullptr;
int(*mainptr)(int argc, char** argv) = my_nullptr;
assert(mainptr == my_nullptr);
assert(my_nullptr == mainptr);
}
// TEST_my_nullptr_const
{
const int a = 321, *p = my_nullptr;
assert(p == my_nullptr);
assert(my_nullptr == p);
p = &a;
assert(p != my_nullptr);
assert(my_nullptr != p);
const int** ptr = my_nullptr;
assert(ptr == my_nullptr);
assert(my_nullptr == ptr);
ptr = &p;
assert(ptr != my_nullptr);
assert(my_nullptr != ptr);
assert(*ptr != my_nullptr);
assert(my_nullptr != *ptr);
}
// TEST_my_nullptr_member
{
int Test123::*pINT = my_nullptr;
assert(pINT == my_nullptr);
assert(my_nullptr == pINT);
pINT = &Test123::ABCD;
assert(pINT != my_nullptr);
assert(my_nullptr != pINT);
test123.*pINT = 0123;
const int Test123::*pCINT = my_nullptr;
assert(pCINT == my_nullptr);
assert(my_nullptr == pCINT);
pCINT = &Test123::ABCD;
assert(pCINT != my_nullptr);
assert(my_nullptr != pCINT);
assert(test123.*pCINT == test123.*pINT);
}
// TEST_my_nullptr_Function
{
void (Test::*pm)(void) = &Test::method;
pm = my_nullptr;
> int (Test::*pABCD)(void) const = my_nullptr; // This Fxxk Line In VS2013
pABCD = &Test::getABCD;
int a1 = (test.*pABCD)();
pABCD = &Test::get2ABCD;
int a2 = (test.*pABCD)();
pABCD = &Test::get3ABCD;
int a3 = (test.*pABCD)();
assert(a1 + a2 == a3);
}
std::cout << "All Tests for my_nullptr Passed!" << std::endl;
return 0;
}
mostrano in modo esplicito a quale linea appare l'errore e mostrare il messaggio di errore completo. – Jarod42
Hai una struttura anonima nel tuo codice. –
Sembra un errore di MS nella 'const' della variabile' pABCD'. Magari presentare un bug report su http://connect.microsoft.com? – Niall