为什么编译器没有看到指定的默认参数值?

时间:2014-03-16 21:33:24

标签: c++

观察以下界面/实施:

properties.h

class Property
{
  public:
    Property(PropertyCollection * propertyCollection, std::string key, 
      std::string value, uint32_t identifier);

properties.cpp

Property::Property(PropertyCollection * propertyCollection, 
  std::string key, std::string value, uint32_t identifier = 0)
  : propertyCollection(propertyCollection), key(key), value(value), 
    identifier(identifier) {}

如您所见,我有一个最后一个参数的默认初始值设定项。

但是,我仍然遇到这个Eclipse错误:

的main.cpp

Properties properties (*file);
Property property (&properties, std::string("Cats"), std::string("Rule"));
  

没有匹配函数来调用'Property :: Property(Properties *,std :: string,std :: string)'

编辑:Properties继承自PropertyCollectionPropertyCollection是一个纯虚拟类。

 +----------------------+
 |    <<pure virtual>>  |
 | PropertyCollection   |
 +----------------------+
 |                      |
 +----------------------+
             ^
             |
             +
+-----------------------+
| Properties            |
|-----------------------|
|                       |
+-----------------------+

在Java中,我将Properties * 视为* PropertyCollection,并按原样传递引用。但是,在C ++中,我必须以某种方式将指针强制转换为基类吗?

编辑:猜不是。唯一的问题是默认初始化程序的位置。

4 个答案:

答案 0 :(得分:4)

原因

好像你从源代码中包含properties.h,然后链接到properties.cpp内的内容,这在琐碎的情况下完全正常。

但是当你正在做你正在做的事情时,编译器无法知道(在编译 main 时)你试图调用的构造函数有一个默认参数(这不知道直到你链接properties.cpp)。

main 中,编译器只知道你告诉它的内容,更具体地说它只知道

Property::Property (PropertyCollection * propertyCollection, std::string key, 
  std::string value, uint32_t identifier);

解决方案

简单且推荐的解决方案是将默认值规范移动到properties.h中的构造函数声明,这样编译器将拥有使工作正常工作所需的所有信息你想要的方式。


答案 1 :(得分:1)

您需要将默认参数放在成员函数声明中,即在头文件中,而不是在定义中:

class Property
{
  public:
    Property(PropertyCollection * propertyCollection, std::string key, 
      std::string value, uint32_t identifier = 0);

在您显示的代码中,main只能看到Property::Property(PropertyCollection*, std::string, std::string, uint32_t)

答案 2 :(得分:1)

解决方案已经在juanchopanza的答案中提供了。我将介绍.h文件和.cpp文件在更改后应该如何看待。

<强> properties.h

class Property
{
  public:
    Property(PropertyCollection * propertyCollection, std::string key, 
      std::string value, uint32_t identifier = 0);

<强> properties.cpp

Property::Property(PropertyCollection * propertyCollection, 
  std::string key, std::string value, uint32_t identifier)
  : propertyCollection(propertyCollection), key(key), value(value), 
    identifier(identifier) {}

答案 3 :(得分:0)

在构造函数中:

Property(PropertyCollection * propertyCollection, std::string key, std::string value);

你的构造函数:

Property(Property * propertyCollection, std::string key, std::string value);

传递PropertyCollection对象的地址,或创建新的构造函数。