在类构造函数上没有匹配函数来呼叫错误
no matching function for call error on class constructor
我会收到以下错误,说明没有匹配函数呼叫:
no matching function for call to 'Chord::Chord(const char [5], Note* [3], int, int)'
我是C 的新手,因此我可能会犯一个基本错误。但是我要做的是在堆上写笔记,将它们传递给构造函数,并将这些笔记复制到Chord
类中的私有财产中。
我似乎无法指出为什么会发生这种情况。
内部 main ...
Note *notes[] = {
new Note(0, "C", "B#"),
new Note(5, "E", "Fb"),
new Note(8, "G", "G")
};
Chord chord = new Chord("CMaj", notes, 127, 1);
Chord.h
/*
* Chord.h - Library for generating and playing chords
* Created by James Jeffery <jameslovescode@gmail.com>, March 11, 2017.
*/
#ifndef Chord_h
#define Chord_h
#include "Arduino.h"
#include "Note.h"
class Chord
{
public:
Chord(String chord_name, Note notes[], int octave, int velocity);
String getChordName();
void play();
void stop();
private:
Note notes[];
String chord_name;
int octave;
int velocity;
};
#endif
构造器被声明接受Note
的数组,但Note *notes[]
声明了Note*
的数组。正如您在问题中所说的那样,您想在堆上分配Note
s,您应该调整课程以将Note *notes[]
在构造函数中吸入并存储一系列指针。
但是,该解决方案可以(很可能)有所有权和交易的问题(谁负责delete
分配的对象,什么时候发生?/p>
IMO更好的方法是将Note
s存储在Chord
类中的自动持续时间中,以便当"所有者"对象被破坏时将被销毁。为此,您需要更改的所有内容将是您要传递的初始数组:
Note notes[] = {
Note(0, "C", "B#"),
Note(5, "E", "Fb"),
Note(8, "G", "G")
};
另一个选项(如果您真的想使Note
s动态分配)可能是使您的Chord
构造函数创建Note
S作为参数传递的副本,可以用new
分配并在Chord
的DESTRUCTOR中销毁 - 这将解决第一个解决方案中提到的问题(但它将与Chord
中的Note
s与通过构造函数传递的问题连接)
注意:您的问题中还遇到了另一个次要语法错误:Chord chord = new Chord("CMaj", notes, 127, 1);
应该是Chord* chord = new Chord("CMaj", notes, 127, 1);
相关文章:
- 无匹配函数呼叫getline()
- 通过呼叫constexpr函数来定义静态constexpr成员
- 来自QvariantList的std ::函数的通用呼叫
- 将整数(文字)与函数相关联,让呼叫者查询拖鞋的数量
- 错误:呼叫构造器的匹配函数无匹配功能
- 当在函数调用中递增值时,程序正常工作,但是如果我们在单独的行中增加值而不是呼叫函数,则会出现错误.为什么
- 在呼叫运算符函数const中调用运算符时错误
- 在函数呼叫时,请从异质初始化列表中构建元组
- 使用makeword函数创建错误e0109-表观呼叫的括号前表达式必须具有(指针到 - )函数类型
- C 函数呼叫没有足够的模板参数
- 为什么此函数通过类型函数指针调用后,呼叫明智地行为
- 如何根据呼叫线以不同的方式求解函数
- C 线程 - 无匹配函数供呼叫
- 无匹配函数呼叫
- C 使用lambda进行隐式构造函数呼叫期望函数指针
- 无匹配函数呼叫
- Android本机C 函数呼叫导致应用程序崩溃
- 无匹配函数呼叫(类,C )
- C 错误:在自定义类的构造函数呼叫期间使用已删除的函数
- 有多少操作数可以超载函数呼叫操作员采用