【问题标题】:expected constructor, destructor, or type conversion before ‘(’ token error“(”标记错误之前的预期构造函数、析构函数或类型转换
【发布时间】:2018-12-04 14:55:14
【问题描述】:

我正在使用 ubuntu 17.04 LTS 和 gcc 7.3 alognside CMake。不幸的是,我收到了这个错误:

[ 37%] Building CXX object source/server/Scripts/CMakeFiles/L5RP.dir/CarDealer/cardealer.cpp.o
/home/kkraujelis/Desktop/L5RP/ragemp/source/server/Scripts/CarDealer/cardealer.cpp:10:30: error: expected constructor, destructor, or type conversion before ‘(’ token
 CarDealer::CarOffer::CarOffer(CarDealer::CarDealer const* dealer, uint32_t price, std::string const& model, double fuelUsagePerKilo) {
                              ^
source/server/Scripts/CMakeFiles/L5RP.dir/build.make:182: recipe for target 'source/server/Scripts/CMakeFiles/L5RP.dir/CarDealer/cardealer.cpp.o' failed
make[2]: *** [source/server/Scripts/CMakeFiles/L5RP.dir/CarDealer/cardealer.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....
CMakeFiles/Makefile2:194: recipe for target 'source/server/Scripts/CMakeFiles/L5RP.dir/all' failed
make[1]: *** [source/server/Scripts/CMakeFiles/L5RP.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

我在任何地方读到它都被证明是基本的语法错误或许多其他事情。可能我是个盲人,但是每次我检查代码时似乎都没有问题。

标题:

#pragma once

#define SIMEONS_CARDEALER   0

namespace L5RP {

    namespace Scripts {

        namespace CarDealer {

            class CarDealer;
            class CarDealerScript;

            class CarOffer {

                CarDealer const* dealer;
                uint32_t price;
                std::string model;
                double fuelUsagePerKilo;

            public:

                CarOffer(
                    CarDealer const* dealer,
                    uint32_t price,
                    std::string const& model,
                    double fuelUsagePerKilo
                );

                CarDealer const* getDealer() const;
                uint32_t getPrice() const;
                std::string const& getModelName() const;
                uint32_t getModel() const;
                double getFuelUsagePerKilo() const;

            };

            /*** Some other classes ***/

        }

    }

}

#include "Simeons/simeons.h"

来源:

#include "../scripts.h"

using namespace L5RP;
using namespace L5RP::Scripts;
using namespace L5RP::Scripts::Government;
using namespace L5RP::Scripts::CarDealer;
using namespace L5RP::Scripts::Character;
using namespace L5RP::Scripts::VehicleLogic;

CarDealer::CarOffer::CarOffer(CarDealer::CarDealer const* dealer, uint32_t price, std::string const& model, double fuelUsagePerKilo) {
    this->dealer = dealer;
    this->price = price;
    this->model = model;
    this->fuelUsagePerKilo = fuelUsagePerKilo;
}

【问题讨论】:

  • 您对类和命名空间使用了两个相同的名称CarDealer。如果你声明使用命名空间,那么你不需要在类成员定义前加上命名空间。
  • 我以前用过,结果没问题。不过我会尝试更改班级的名称。
  • 以前的工作可能与今天的代码不同。
  • 是的,改名解决了这个问题。但是,如果我有 CarDealer 命名空间并且我想在其中定义 CarDealer 类,您会为我推荐什么名称?我的意思是没有名字我不能上课。
  • 可能在命名空间中命名类而不以 Car: Dealer、Offer 开头。

标签: c++ ubuntu gcc ubuntu-17.04


【解决方案1】:

https://stackoverflow.com/users/6752050/s-m 在评论部分修复了一个问题。

我无法将他的评论标记为答案。所以我会引用他的话:

您为类和命名空间使用了两个相同的名称 CarDealer。如果你声明使用命名空间,那么你不需要在类成员定义前加上命名空间。

【讨论】:

  • @S.M,您已被引用为“您的”答案。
【解决方案2】:

当你实现你的函数时,你必须完全限定类类型,包括命名空间。

通常你会简单地用适当的命名空间包围你的定义,如下所示:

namespace L5RP {
    namespace Scripts {
        namespace CarDealer {
            CarOffer::CarOffer(CarDealer const* dealer, uint32_t price, std::string const& model, double fuelUsagePerKilo) 
            {
                this->dealer = dealer;
                this->price = price;
                this->model = model;
                this->fuelUsagePerKilo = fuelUsagePerKilo;
            }
        }
    }
}

更好的是,您可以在适当的时候在初始化列表中初始化您的成员。所以你的代码看起来像:

namespace L5RP 
{
    namespace Scripts 
    {
        namespace CarDealer 
        {
            CarOffer::CarOffer(CarDealer const* dealer, uint32_t price, std::string const& model, double fuelUsagePerKilo) 
                : dealer(dealer)
                , price(price)
                , model(model)
                , fuelUsagePerKilo(fuelUsagePerKilo)
            {
            }
        }
    }
}

【讨论】:

  • 第一个例子不做我使用命名空间 L5RP 的事情;使用命名空间 L5RP::Scripts;做过?有时编译器也强迫我像你一样初始化东西。它改变了什么?
  • 好吧,使用初始化列表避免了冗余初始化(这里默认构造然后赋值)。专业的 C++ 程序员通常会编写高效的代码。
  • 我从未见过或尝试过使用命名空间来定义其中的内容。我从没想过它会起作用,也从未见过任何例子。
猜你喜欢
  • 2016-03-14
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多