Home » Extra libraries, Code snippets, applications etc. » C++ language problems and code snippets » prototype not found (MinGW doesnt understand defaults)
prototype not found [message #51851] |
Sun, 09 June 2019 18:59  |
Leander
Messages: 13 Registered: January 2019
|
Promising Member |
|
|
Hi together.
Have got this code here:
#include <string>
#include <stdlib.h>
using namespace std;
template <typename T>
T* new_(int size=1, bool init=false);
template <typename T>
T* new_(int size, bool init)
{
if (size < 1) {return NULL;}
T *p = NULL;
if (size==1) {p = new T;}
else {p = new T[size];}
if (!p) exit(-1);
if (init) memset(p, 0, sizeof(T) * size);
return p;
}
int main()
{
std::string *pst;
pst = (string*)new_();
return 0;
}
The return "pst" should be enough to know what is a T.
But even the cast doesnt help (couldn't deduce...), see below.
Now I can call it with args or without and the MinGW will rant it (return.txt):
main.cpp: In function 'int main()':
main.cpp:28:22: error: no matching function for call to 'new_()'
main.cpp:28:22: note: candidate is:
main.cpp:14:4: note: template<class T> T* new_(int, bool)
main.cpp:14:4: note: template argument deduction/substitution failed:
main.cpp:28:22: note: couldn't deduce template parameter 'T'
And it suggests the only existing always, the upper prototype,
but doesnt accept it.
Someone has got a tip?
Martin
|
|
|
Re: prototype not found [message #51859 is a reply to message #51851] |
Mon, 10 June 2019 16:55   |
Novo
Messages: 1430 Registered: December 2006
|
Ultimate Contributor |
|
|
Type conversion operator will be able to deduct type in your case.
struct S {
template <typename T>
operator T() const;
};
Regards,
Novo
|
|
|
|
|
Re: prototype not found [message #51888 is a reply to message #51887] |
Tue, 11 June 2019 20:21   |
Novo
Messages: 1430 Registered: December 2006
|
Ultimate Contributor |
|
|
You should even be able to write code like this:
new_ new12(12);
const char* str2 = new12;
std::string* pst2 = new12;
Regards,
Novo
|
|
|
|
Re: prototype not found [message #51930 is a reply to message #51851] |
Fri, 21 June 2019 17:59   |
 |
mirek
Messages: 14255 Registered: November 2005
|
Ultimate Member |
|
|
Leander wrote on Sun, 09 June 2019 18:59Hi together.
Have got this code here:
#include <string>
#include <stdlib.h>
using namespace std;
template <typename T>
T* new_(int size=1, bool init=false);
template <typename T>
T* new_(int size, bool init)
{
if (size < 1) {return NULL;}
T *p = NULL;
if (size==1) {p = new T;}
else {p = new T[size];}
if (!p) exit(-1);
if (init) memset(p, 0, sizeof(T) * size);
return p;
}
int main()
{
std::string *pst;
pst = (string*)new_();
return 0;
}
The return "pst" should be enough to know what is a T.
No, it is not. Types only can get resolved as parameters. But, good news, you can specify it directly:
pst = new_<string>();
[Updated on: Fri, 21 June 2019 17:59] Report message to a moderator
|
|
|
|
Goto Forum:
Current Time: Mon Apr 28 01:03:18 CEST 2025
Total time taken to generate the page: 0.00929 seconds
|