Closed. This question is not reproducible or was caused by typos. It is not currently accepting answers.
This question was caused by a typo or a problem that can no longer be reproduced. While similar questions may be on-topic here, this one was resolved in a way less likely to help future readers.
Closed 1 year ago.
Improve this question
In index.hpp I have created a class that has multiple data members like int age, std::string city; etc. i have defined a constructor outside the class. In program.cpp i have created an object called sam. when i try to compile it, it shows error. what's the reason?
program.cpp
#include<iostream>
#include "index.hpp"
int main(){
profile sam("Sam Drakkila", 30, "New York", "USA", "he/him");
std::cout<<sam.name;
}
index.hpp
#include<iostream>
#include<vector>
class profile{
public:
std::string name;
int age;
std::string city;
std::string country;
std::string pronouns;
std::vector<std::string> hobbies;
};
profile::profile(std::string new_name, int new_age,std::string
new_city,std::string new_country, std::string
new_pronouns = "they/them"){
name = new_name;
age = new_age;
city = new_city;
country = new_country;
pronouns = new_pronouns;
}
error message
In file included from program.cpp:2:0:
index.hpp:15:1: error: prototype for 'profile::profile(std::__cxx11::string, int, std::__cxx11::string, std::__cxx11::string, std::__cxx11::string)' does not match any in class 'profile'
profile::profile(std::string new_name, int new_age,std::string
^~~~~~~
index.hpp:4:7: error: candidates are: profile::profile(profile&&)
class profile{
^~~~~~~
index.hpp:4:7: error: profile::profile(const profile&)
index.hpp:4:7: error: profile::profile()
program.cpp: In function 'int main()':
program.cpp:5:62: error: no matching function for call to 'profile::profile(const char [13], int, const char [9], const char [4], const char [7])'
profile sam("Sam Drakkila", 30, "New York", "USA", "he/him");
^
In file included from program.cpp:2:0:
index.hpp:4:7: note: candidate: profile::profile()
class profile{
^~~~~~~
index.hpp:4:7: note: candidate expects 0 arguments, 5 provided
index.hpp:4:7: note: candidate: profile::profile(const profile&)
index.hpp:4:7: note: candidate expects 1 argument, 5 provided
index.hpp:4:7: note: candidate: profile::profile(profile&&)
index.hpp:4:7: note: candidate: profile::profile(const profile&)
index.hpp:4:7: note: candidate expects 1 argument, 5 provided
index.hpp:4:7: note: candidate: profile::profile(profile&&)
index.hpp:4:7: note: candidate expects 1 argument, 5 provided
.\index }
index.hpp:15:1: error: prototype for 'profile::profile(std::__cxx11::string, int, std::__cxx11::string, std::__cxx11::string, std::__cxx11::string)' does not match any in class 'profile'
profile::profile(std::string new_name, int new_age,std::string
^~~~~~~
index.hpp:4:7: error: candidates are: profile::profile(profile&&)
class profile{
^~~~~~~
index.hpp:4:7: error: profile::profile(const profile&)
index.hpp:4:7: error: profile::profile()
i have defined a constructor outside the class
Yes, but you have not declared it inside the class.
Also, you should not put code inside header files unless you are creating a template.
To fix your problem, add the declaration to the class:
class profile{
public:
profile(std::string new_name, int new_age, std::string new_city, std::string new_country, std::string new_pronouns);
std::string name;
int age;
std::string city;
std::string country;
std::string pronouns;
std::vector<std::string> hobbies;
};
You should also consider moving the code of the constructor to index.cpp, and renaming the files profile.hpp and profile.cpp for clarity.
You need to declare the constructor inside the class definition:
class profile{
public:
std::string name;
int age;
std::string city;
std::string country;
std::string pronouns;
std::vector<std::string> hobbies;
profile::profile(std::string new_name, int new_age,std::string
new_city,std::string new_country, std::string
new_pronouns = "they/them");
};
As a side note: you should prefer a member initializer list for the task done by the constructor.
Related
I'm taking a C++ Codecademy course and I ran into this error when calling my constructor.
profile.cpp:4:1: error: prototype for ‘Profile::Profile(std::__cxx11::string, int, std::__cxx11::string, std::__cxx11::string)’ does not match any in class ‘Profile’
Profile::Profile(string new_name, int new_age, string new_city, string new_pronouns) {
^~~~~~~
In file included from profile.cpp:1:0:
profile.hpp:4:7: error: candidates are: Profile::Profile(Profile&&)
class Profile {
^~~~~~~
profile.hpp:4:7: error: Profile::Profile(const Profile&)
profile.hpp:15:5: error: Profile::Profile(std::__cxx11::string, int, std::__cxx11::string, std::__cxx11::string, std::__cxx11::string)
Profile(string new_name, int new_age, string new_city, string new_country, string pronouns);
^~~~~~~
Here is my code in profile.cpp
#include "profile.hpp"
#include <vector>
using namespace std;
Profile::Profile(string new_name, int new_age, string new_city, string new_pronouns) {
name = new_name;
age = new_age;
city = new_city;
country = new_country;
pronouns = new_pronouns;
}
Here is my code in profile.hpp
#include <iostream>
#include <vector>
using namespace std;
class Profile {
private:
string name;
int age;
string city;
string country;
string pronouns;
vector<string> hobbies;
public:
Profile(string new_name, int new_age, string new_city, string new_country, string pronouns);
};
Here is my code in main.cpp
#include <iostream>
#include "profile.hpp"
int main() {
Profile sam("Sam Drakkila",30,"New York","USA","he/him");
}
I believe there is a problem with calling the constructor (as stated in title) but I am not sure. I have only started OOP a few days ago so I am very new and need a Simplified answer.
Here is the problem. I encountered an error before where I was calling 5 arguments in main.cpp but only declared 4 arguments to be called. To fix that issue I added "New_country" as a parameter. I simply forgot to update profile.cpp to add another parameter after updating profile.hpp with "new_country".
This question already has answers here:
Does a type require a default constructor in order to declare an array of it?
(9 answers)
Object array initialization without default constructor
(14 answers)
Closed 6 months ago.
In my code I am using the get, set and Employee constructor for getting and take the employee data for that I am creating an one .h file and two .cpp file. While executing these files i am getting error.
So my first .h file is emp.h:
#include<iostream>
class Employee
{
private:
std::string emp_Name,emp_ID,emp_Address;
public:
Employee(std::string name, std::string id, std::string address):emp_Name(name),
emp_ID(id),emp_Address(address)
{
}
void setempname(std::string name);
void setempid(std::string id);
void setempage(std::string address);
std::string getempname();
std::string getempid();
std::string getempaddress();
};
My first .cpp file is emp.cpp
#include "emp.h"
void Employee::setempname(std::string name)
{
emp_Name=name;
}
void Employee::setempid(std::string id)
{
emp_ID=id;
}
void Employee::setempage(std::string address)
{
emp_Address=address;
}
std::string Employee::getempname()
{
return emp_Name;
}
std::string Employee::getempid()
{
return emp_ID;
}
std::string Employee::getempaddress()
{
return emp_Address;
}
My second .cpp file is Main.cpp:
#include "emp.h"
int main()
{
Employee emp[2];
emp[0]= Employee ("Rohi","E345","Clk");
return 0;
}
The Error I am getting is:
g++ emp.cpp Main.cpp
Main.cpp: In function ‘int main()’:
Main.cpp:4:23: error: no matching function for call to ‘Employee::Employee()’
Employee emp[2];
^
In file included from Main.cpp:1:
emp.h:7:3: note: candidate: ‘Employee::Employee(std::__cxx11::string, std::__cxx11::string, std::__cxx11::string)’
Employee(std::string name, std::string id, std::string address):emp_Name(name),
^~~~~~~~
emp.h:7:3: note: candidate expects 3 arguments, 0 provided
emp.h:2:7: note: candidate: ‘Employee::Employee(const Employee&)’
class Employee
^~~~~~~~
emp.h:2:7: note: candidate expects 1 argument, 0 provided
emp.h:2:7: note: candidate: ‘Employee::Employee(Employee&&)’
emp.h:2:7: note: candidate expects 1 argument, 0 provided
So Anyone please help me to solve these error.
I have seen similar questions asked and tried their solutions but the answers to them do not seem to work. I have the following code:
.h
#include <iostream>
#include <vector>
#include <string>
using std::string; using std::vector;
struct DialogueNode;
struct DialogueOption {
string text;
DialogueNode *next_node;
int return_code;
DialogueOption(string t, int rc, DialogueNode * nn) : text{t},
return_code{rc}, next_node{nn} {}
};
struct DialogueNode {
string text;
vector <DialogueOption> dialogue_options;
DialogueNode();
DialogueNode(const string &);
};
struct DialogueTree {
DialogueTree() {}
void init();
void destroyTree();
int performDialogue();
private:
vector <DialogueNode*> dialogue_nodes;
};
.cpp
#include "dialogue_tree.h"
DialogueNode::DialogueNode(const string &t) : text{t} {}
void DialogueTree::init() {
string s = "Hello";
for(int i = 0; i < 5; i++) {
DialogueNode *node = new DialogueNode(s);
dialogue_nodes.push_back(node);
delete node;
}
}
void DialogueTree::destroyTree() {
}
int DialogueTree::performDialogue() {
return 0;
}
int main() {
return 0;
}
I get the error: error: no matching function for call to ‘DialogueNode:: DialogueNode(std::__cxx11::string&)’ DialogueNode *node = new DialogueNode(s);
EDIT additional notes on error
dialogue_tree.h:17:8: note: candidate: DialogueNode::DialogueNode()
dialogue_tree.h:17:8: note: candidate expects 0 arguments, 1 provided
dialogue_tree.h:17:8: note: candidate: DialogueNode::DialogueNode(const DialogueNode&)
dialogue_tree.h:17:8: note: no known conversion for argument 1 from ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ to ‘const DialogueNode&’
dialogue_tree.h:17:8: note: candidate: DialogueNode::DialogueNode(DialogueNode&&)
dialogue_tree.h:17:8: note: no known conversion for argument 1 from ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ to ‘DialogueNode&&’
Which makes no sense to me because I have the constructor defined to take a string as an argument.
You've declared your constructor as:
DialogueNode(const string);
But defined it as:
DialogueNode(const string &t);
Those two aren't the same; the former takes a const string while the latter takes a const string reference. You'll have to add the & to specify a reference argument:
DialogueNode(const string &);
it is because in the constructor you are specifying that the parameter will be a string of constant type and when creating an object you are passing a string. The type mismatch is the problem, either fix the constructor parameter to string or change when you are creating an object.
When compiled using g++ MainStudent.cpp Student.cpp
These are the errors i get :
MainStudent.cpp: In function ‘int main()’: MainStudent.cpp:23:38:
error: no matching function for call to ‘Student::Student(char [10],
char [10], int&, double [3])’ MainStudent.cpp:23:38: note: candidates
are: Student.h:13:2: note: Student::Student(char*, char*, int, double)
Student.h:13:2: note: no known conversion for argument 4 from
‘double [3]’ to ‘double’ Student.h:5:7: note: Student::Student(const
Student&) Student.h:5:7: note: candidate expects 1 argument, 4
provided Student.cpp: In constructor ‘Student::Student(char*, char*,
int, double)’: Student.cpp:9:11: error: incompatible types in
assignment of ‘double’ to ‘double [3]’ Student.cpp: At global scope:
Student.cpp:14:5: error: prototype for ‘int Student::Getage()’ does
not match any in class ‘Student’ Student.h:16:7: error: candidate is:
int* Student::Getage() Student.cpp:15:8: error: prototype for ‘double
Student::Getmarks()’ does not match any in class ‘Student’
Student.h:17:10: error: candidate is: double* Student::Getmarks()
I can't figure out where the problem lies...
Your constructor is
Student::Student (char *fname, char *lname, int age, double marks)
^^^^^^^^^^^^
But you are trying to pass an array to it in
double marks[3];
//...
Student st1(fname, lname, age, marks);
You either need to get rid of the array in the class and just take a double or change the constructor to take a double array and then copy it in the constructor like
Student::Student (char *fname, char *lname, int age, const double (&marks)[3]) {
// ^^^^^^^^^^^^^^^ use array of size 3
// since that is what _marks is
strcpy(_fname, fname);
strcpy(_lname, lname);
_age = age;
for (int i = 0; i < 3; i++)
_marks[i] = marks[i];
}
I have following problem.
vector<thread> vThreads;
list<Crob *> lRobs;
list<Crob *>::iterator i;
for(i = lRobs.begin(); i != lRobs.end(); i++)
{
vThreads.push_back(thread((*i)->findPath));
}
I want to pass the method findPath to a thread, but I just get a lot of errors...
> labrob.cpp: In function ‘int main(int, char**)’:
labrob.cpp:72:43: error: no matching function for call to ‘std::thread::thread(<unresolved overloaded function type>)’
labrob.cpp:72:43: note: candidates are:
In file included from labrob.cpp:14:0:
/usr/include/c++/4.7/thread:131:7: note: std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = int (Crob::*)(); _Args = {}]
/usr/include/c++/4.7/thread:131:7: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘int (Crob::*&&)()’
/usr/include/c++/4.7/thread:126:5: note: std::thread::thread(std::thread&&)
/usr/include/c++/4.7/thread:126:5: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘std::thread&&’
/usr/include/c++/4.7/thread:122:5: note: std::thread::thread()
/usr/include/c++/4.7/thread:122:5: note: candidate expects 0 arguments, 1 provided
make: *** [labrob.o] Error 1
I have already tried to pass local functions and that worked without problems...
Added CRob header
#pragma once
#include "point.hpp"
#include "lab.hpp"
class Crob
{
protected:
Cpoint *pos;
int steps;
Clab *labfind;
string direction;
public:
Crob(Clab *lab);
virtual ~Crob();
virtual void findPath();
void moveTo(int x, int y);
void moveToPrint(int x, int y);
int getSteps(void);
void checkDirection();
};
Looks like you're trying to pass a non-static method to the std::thread constructor. You cannot do that: a non-static methods needs a object so it can be called. Looks like you want:
for(i = lRobs.begin(); i != lRobs.end(); i++)
{
vThreads.push_back(std::thread(&Crob::findPath, *i));
}