VS 2013 C++ 中的错误 c2664

Error c2664 in VS 2013 C++

本文关键字:错误 c2664 2013 C++ VS      更新时间:2023-10-16

所以,我有一个名为"music"的类,当我尝试编译代码时,它给了我以下错误:

错误

13 错误 C2664:"音乐::音乐(常量音乐 &(":无法转换 参数 2 从 'const char [5]' 到 'char' c:\users\andrei Bordeianu\documents\Visual Studio 2013\项目\媒体加\媒体加\来源.cpp 362 1 媒体加

14 智能感知:没有构造函数"music::music"匹配的实例 参数列表 参数类型包括:(常量字符 [5]、常量字符 [5]、常量字符 [4]、常量字符 [12]、整数、常量字符 [8]、常量字符 [5], int( c:\Users\Andrei Bordeianu\Documents\Visual Studio 2013\项目\媒体加\媒体加\来源.cpp 361 11 MediaPlus

这是类:

// Music class.
class music {
    char* song;
    properties musicProperties;
public:
    music() {
        cout << "Apel constructor default muzica." << endl;
        this->song = NULL;
    }
    music(char* songName, char name, char type, char path, float size, char artist, char title, int year) {
        cout << "Apel constructor cu parametri muzica." << endl;
        if (songName) {
            this->song = new char[strlen(songName) + 1];
            strcpy(this->song, songName);
            musicProperties.setDataMusic(name, type, path, size, artist, title, year);
        } else {
            songName = NULL;
        }
    }
    music operator=(const music &songName) {
        cout << "Supraincarcare operator = pentru muzica." << endl;
        this->song = new char[strlen(songName.song) + 1];
        strcpy(this->song, songName.song);
    }
    music(const music &songName) {
        cout << "Apel constructor de copiere muzica." << endl;
        if (songName.song) {
            this->song = new char[strlen(songName.song) + 1];
            strcpy(this->song, songName.song);
        } else {
            song = NULL;
        }
    }
    ~music() {
        cout << "Apel destructor muzica." << endl;
        if (this->song) {
            cout << "Apel destructor pentru: " << this->song << endl;
            delete[] song;
        }
    }
    friend char* getMusic(const music& m);
    friend ostream& operator<<(ostream& out, music& m);
    friend istream& operator>>(istream& in, music& m);
};

这是主要的:

void main() {
    music m1;
    music m2("ceva", "ceva", "mp3", "c:datamusic", 38, "Rihanna", "Stay", 2013);
    music m3 = m1;
}

好的,尝试了您的建议,并更改为字符串,现在我的应用程序如下所示:

#include <iostream>
#include <string>
using namespace std;
// Properties class.
class properties{
    string name;
    string type;
    string path;
    float size;
    // For images.
    int width;
    int height;
    // For music.
    string artist;
    string title;
    int year;
public:
    properties() {
        cout << "Apel constructor default proprietati." << endl;
        this->name = "";
        this->type = "";
        this->path = "";
        this->size = 0;
        this->width = 0;
        this->height = 0;
        this->artist = "";
        this->title = "";
        this->year = 0;
    }
    properties(string name, string type, string path, float size, int width, int height, string artist, string title, int year) {
        cout << "Apel constructor cu parametrii proprietati." << endl;
        this->name = name;
        this->type = type;
        this->path = path;
        this->size = size;
        this->width = width;
        this->height = height;
        this->artist = artist;
        this->title = title;
        this->year = year;
    }
    char getName() {
        return this->name;
    }
    char getType() {
        return this->type;
    }
    char getPath() {
        return this->path;
    }
    float getSize() {
        return this->size;
    }
    int getWidth() {
        return this->width;
    }
    int getHeight() {
        return this->height;
    }
    char getArtist() {
        return this->artist;
    }
    char getTitle() {
        return this->title;
    }
    int getYear() {
        return this->year;
    }
    void setName(string name){
        this->name = name;
    }
    void setPath(string path){
        this->path = path;
    }
    void setType(string type){
        this->type = type;
    }
    void setSize(float size){
        this->size = size;
    }
    void setWidth(int width){
        this->width = width;
    }
    void setHeight(int height){
        this->height = height;
    }
    void setArtist(string artist){
        this->artist = artist;
    }
    void setTitle(string title){
        this->title = title;
    }
    void setYear(int year){
        this->year = year;
    }
    void setDataGeneral(string name, string type, string path, float size){
        cout << "Apel setter general properties." << endl;
        setName(name);
        setType(type);
        setPath(path);
        setSize(size);
    }
    void setDataMusic(string name, string type, string path, float size, string artist, string title, int year){
        cout << "Apel setter music properties." << endl;
        setName(name);
        setType(type);
        setPath(path);
        setSize(size);
        setArtist(artist);
        setTitle(title);
        setYear(year);
    }
    void setDataImages(string name, string type, string path, float size, int width, int height){
        cout << "Apel setter image properties." << endl;
        setName(name);
        setType(type);
        setPath(path);
        setSize(size);
        setWidth(width);
        setHeight(height);
    }
    // Constructor de copiere.
    properties(const properties& p){
        cout << "Apel constructor copiere properties." << endl;
        this->name = p.name;
        this->type = p.type;
        this->path = p.path;
        this->size = p.size;
        this->width = p.width;
        this->height = p.height;
        this->artist = p.artist;
        this->title = p.title;
        this->year = p.year;
    }
    ~properties(){
        cout << "Apel destructor properties." << endl;
    };
};
// Music class.
class music {
    char* song;
    properties musicProperties;
public:
    music() {
        cout << "Apel constructor default muzica." << endl;
        this->song = NULL;
    }
    music(char* songName, string name, string type, string path, float size, string artist, string title, int year) {
        cout << "Apel constructor cu parametri muzica." << endl;
        if (songName) {
            this->song = new char[strlen(songName) + 1];
            strcpy(this->song, songName);
            musicProperties.setDataMusic(name, type, path, size, artist, title, year);
        } else {
            songName = NULL;
        }
    }
    music operator=(const music &songName) {
        cout << "Supraincarcare operator = pentru muzica." << endl;
        this->song = new char[strlen(songName.song) + 1];
        strcpy(this->song, songName.song);
    }
    music(const music &songName) {
        cout << "Apel constructor de copiere muzica." << endl;
        if (songName.song) {
            this->song = new char[strlen(songName.song) + 1];
            strcpy(this->song, songName.song);
        } else {
            song = NULL;
        }
    }
    ~music() {
        cout << "Apel destructor muzica." << endl;
        if (this->song) {
            cout << "Apel destructor pentru: " << this->song << endl;
            delete[] song;
        }
    }
    friend char* getMusic( music& m); //const
    friend ostream& operator<<(ostream& out, music& m);
    friend istream& operator>>(istream& in, music& m);
};
// Movies class.
class movies {
    char* movie;
    properties moviesProperties;
public:
    movies() {
        cout << "Apel constructor default filme." << endl;
        movie = NULL;
    }
    movies(char* movieTitle, string name, string type, string path, float size) {
        cout << "Apel constructor cu parametri filme." << endl;
        if (movieTitle) {
            this->movie = new char[strlen(movieTitle) + 1];
            strcpy(this->movie, movieTitle);
            moviesProperties.setDataGeneral(name, type, path, size);
        } else {
            movie = NULL;
        }
    }
    movies operator=(const movies &movieTitle) {
        cout << "Supraincarcare operator = pentru filme." << endl;
        this->movie = new char[strlen(movieTitle.movie) + 1];
        strcpy(this->movie, movieTitle.movie);
    }
    movies(const movies &movieTitle) {
        cout << "Apel constructor de copiere filme." << endl;
        if (movieTitle.movie) {
            this->movie = new char[strlen(movieTitle.movie) + 1];
            strcpy(this->movie, movieTitle.movie);
        } else {
            movie = NULL;
        }
    }
    ~movies() {
        cout << "Apel destructor filme." << endl;
        if (this->movie) {
            cout << "Apel destructor pentru: " << this->movie << endl;
            delete[] movie;
        }
    }
    friend char* getMovies(const movies& m);
    friend ostream& operator<<(ostream& out, movies& m);
    friend istream& operator>>(istream& in, movies& m);
};
// Images class.
class images {
    char* image;
    properties imagesProperties;
public:
    images() {
        cout << "Apel constructor default imagini." << endl;
        image = NULL;
    }
    images(char* imageName, string name, string type, string path, float size, int width, int height) {
        cout << "Apel constructor cu parametri imagini." << endl;
        if (imageName) {
            this->image = new char[strlen(imageName) + 1];
            strcpy(this->image, imageName);
            imagesProperties.setDataImages(name, type, path, size, width, height);
        } else {
            image = NULL;
        }
    }
    images operator=(const images &imageName) {
        cout << "Supraincarcare operator = pentru imagini." << endl;
        this->image = new char[strlen(imageName.image) + 1];
        strcpy(this->image, imageName.image);
    }
    images(const images &imageName) {
        cout << "Apel constructor de copiere muzica." << endl;
        if (imageName.image) {
            this->image = new char[strlen(imageName.image) + 1];
            strcpy(this->image, imageName.image);
        }
        else {
            image = NULL;
        }
    }
    ~images() {
        cout << "Apel destructor muzica." << endl;
        if (this->image) {
            cout << "Apel destructor pentru: " << this->image << endl;
            delete[] image;
        }
    }
    friend char* getImages(const images& i);
    friend ostream& operator<<(ostream& out, images& i);
    friend istream& operator>>(istream& in, images& i);
};
char* getMovies(const movies& m) {
    if (m.movie)
        return m.movie;
    else
        return NULL;
}
char* getImages(const images& i) {
    if (i.image)
        return i.image;
    else
        return NULL;
}
char* getMusic(music& songName) { //const
    if (songName.song)
        return songName.song;
    else
        return NULL;
}
ostream& operator<<(ostream& out, music& s) {
    out << "Melodia este: " << s.song << endl;
    return out;
}
istream& operator>>(istream& in, music& s) {
    char buffer[20];
    cout << "Melodia: "; 
    in >> buffer;
    s.song = new char[strlen(buffer) + 1];
    strcpy(s.song, buffer);
    return in;
}
void main() {
    music m1;
    music m2("ceva", "ceva", "mp3", "c:datamusic", 38, "Rihanna", "Stay", 2013);
    music m3 = m1;
    //cout << getMusic(m2) << endl;
    //cout << m2;
    //cin >> m2;
    //cout << m2;
}

它给了我以下错误:

错误

1 错误 C2440:"返回":无法从"std::string"转换为 'Char' C:\users\andrei Bordeianu\documents\Visual Studio 2013\项目\媒体加\媒体加\来源.cpp 50 1 MediaPlus

等。。。

我该如何解决此问题?谢谢!

你应该试试

music(char* songName, char* name, char* type, char* path, float size, char* artist, char* title, int year);

因为 char 是单个字符,而不是指向 C 字符串的指针。更好的是,您应该使用现代字符串类而不是旧的指针类。

您正在尝试将字符串类型("ceva"、"mp3"等(传递到 char 参数中。要解决此问题,请将构造函数参数从 char 更改为 string

在签名中,该函数会接受 char 作为名称,但您发送一个 char*。 music(char* songName, char name, char type, char path, float size, char artist, char title, int year)

我认为应该是: music(char* songName, char* name, char* type, char* path, float size, char* artist, char* title, int year)

你得到了你的anwser,使用字符串类型或指针。

至于为什么会发生这种情况:您将字符作为值传递,这意味着它们获得了自己的新字符数组实例,这与参数的 const 实例冲突。这就是为什么第一个参数(这是一个显式指针(没有导致错误的原因。