+ 1
Direct vs copy initialization
Hi, I am learning about the types of initialization, and so far I've understood the topic well. However I have a problem when trying to make a class that uses copy init. Specifically this case: class SomeCl { int x; public: explicit SomeCl (int a) {/* k1 should be initialized with this constructor */ x = a; cout << "This is direct init."; } SomeCl (const Somecl &a) { //k2 with this x = a.x; cout << "This is copy init."; } }; int main() { SomeCl k(5); // this works with the first SomeCl k2 = 5; return 0; } And it reports an error that says "conversion from int to non-scalar type:
7 Answers
+ 4
Well by writing explicit in front of SomeCl(int a), you're telling the compiler that it must not do automatically the conversion from int to SomeCl;
Then by typing SomeCl k2 = 2; you ask the compiler exactly what you told him not do.
+ 1
Copy init would be:
SomeCl k(5);
SomeCl k2(k);
What you are doing is using the '=' operator with integers, which you would need to overload to use:
SomeCl& operator=(const int& other) {
this->x = other;
return *this;
}
0
Thank you for your answers, especially Zeke, however the compiler still says "conversion from int to non-scalar type 'SomeCl' requested.
The only problem I have understanding is with this specific case, where I am trying to use copy init. with integers. I've played with other ways and types of init. and they all make sense, however this is the one that is making trouble.
0
Oh, and for your answer ~swim~ , I am just trying to see if the program makes a difference between copy and direct init. and this is why I made those cout << "this is..."
If I remove explicit or explicitly wrote SomeCl(5), the othwr constructor wouldn't "run", but only the first which says direct init.