3
我有以下簡單的類轉換:轉換操作INT()失敗的static_cast和reinterpret_cast的
#include <iostream>
using namespace std;
template<int p>
class Mod {
int n;
friend Mod operator+(const Mod &x, const Mod &y) {
const int sum = x.n + y.n;
if (sum < p) {
Mod z(sum);
return z;
} else if (sum >= p) {
Mod z2(sum - p);
return z2;
}
}
operator int() {
if (p == 0) return n;
if (p == 1) return 0;
for (int r = 0; r <= abs(n); r++) {
if (((r - n) % p) == 0) {
return r;
}
}
}
friend Mod operator-(const Mod &x) {
if (x.n == 0) return 0;
Mod z(-static_cast<int>(x) + p);
return z;
}
friend std::ostream &operator<<(std::ostream &out, const Mod &x) {
out << reinterpret_cast<int>(x); // invalid cast from type ‘const Mod<5>’ to type ‘int’ out << reinterpret_cast<int>(x);
return out;
}
public:
Mod(int x) {
n = x;
}
};
int main() {
Mod<5> z(3), x(2);
cout << z + x << endl; // error: invalid cast from type ‘const Mod<5>’ to type ‘int’ out << reinterpret_cast<int>(x);
cout << z << endl; //error: invalid cast from type ‘const Mod<5>’ to type ‘int’ out << reinterpret_cast<int>(x); // invalid cast from type ‘const Mod<5>’ to type ‘int’ out << reinterpret_cast<int>(x);
cout << -x << endl; //error: invalid static_cast from type ‘const Mod<5>’ to type ‘int’ Mod z(-static_cast<int>(x) + p);
return 0;
}
當我嘗試編譯並運行他們,我看到以下消息:
[ 33%] Building CXX object CMakeFiles/TestCpp.dir/main.cpp.o
/home/user/ClionProjects/TestCpp/main.cpp: In instantiation of ‘std::ostream& operator<<(std::ostream&, const Mod<5>&)’:
/home/user/ClionProjects/TestCpp/main.cpp:75:17: required from here
/home/user/ClionProjects/TestCpp/main.cpp:56:13: error: invalid cast from type ‘const Mod<5>’ to type ‘int’
out << reinterpret_cast<int>(x); // invalid cast from type ‘const Mod<5>’ to type ‘int’ out << reinterpret_cast<int>(x);
^
/home/user/ClionProjects/TestCpp/main.cpp: In instantiation of ‘Mod<5> operator-(const Mod<5>&)’:
/home/user/ClionProjects/TestCpp/main.cpp:77:14: required from here
/home/user/ClionProjects/TestCpp/main.cpp:50:36: error: invalid static_cast from type ‘const Mod<5>’ to type ‘int’
Mod z(-static_cast<int>(x) + p);