在命名空间中,如何定义从内部类返回对象的函数?

Posted

技术标签:

【中文标题】在命名空间中,如何定义从内部类返回对象的函数?【英文标题】:Inside a namespace, how to define a function returning an object from an inner class? 【发布时间】:2016-01-25 18:54:32 【问题描述】:

答案可能很明显,但我已经花了几个小时解决这个问题,但没有运气。

我有一个名为“imaging”的命名空间,其中定义了一个类“Image”。头文件编译正常,但.cpp遇到问题。

这是标题:

//Image.h

#ifndef _IMAGE
#define _IMAGE

#include "Array.h"
#include "Serializable.h"
#include "Vec3.h"
#include "ppm_format.h"

namespace imaging

class Image : math::Array<float>, Serializable
       
    public:

        math::Vec3<float> * pixels;

        // constructors and destructor
        Image();                                                 // default: zero dimensions, nullptr for the buffer.   
        Image(unsigned int w, unsigned int h);
        Image(unsigned int w, unsigned int h, const math::Vec3<float> * data_ptr);
        Image(const Image &src);
        ~Image();

        Image & operator = (const Image & right);


;

 //namespace imaging

#endif

这是 .cpp。一切运行良好,直到最后一个运算符重载:

//Image.cpp

#include "Image.h"

namespace imaging 

Image::Image() : Array(0, 0), pixels(nullptr) 

Image::Image(unsigned int w, unsigned int h) : Array(w, h) 

Image::Image(unsigned int w, unsigned int h, const math::Vec3<float> * data_ptr) : Array(w, h)

    memcpy(pixels, data_ptr, sizeof(data_ptr));


Image::Image(const Image &src) : Array(src.width, src.height), pixels(src.pixels) 

Image::~Image() 
    if (pixels != nullptr) delete[] pixels;


Image& Image::operator=(const Image& right) 
    memcpy(pixels, right.pixels, sizeof(right.pixels));
    return *this;

...
 

以下是错误:

error C2143: syntax error: missing ';' before '&'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2086: 'int imaging::Image': redefinition
error C2761: 'imaging::Image &imaging::Image::operator =(const imaging::Image &)': member function redeclaration not allowed
error C2059: syntax error: ''
error C2143: syntax error: missing ';' before ''
error C2447: '': missing function header (old-style formal list?)
error C2509: '<<': member function not declared in 'imaging::Image'

就像“图像”是一个随机词一样。

有什么想法吗?非常感谢!

编辑:顺便说一句,将代码从 .cpp 传输到标头可以解决所有问题。但问题仍然存在,这个例子有什么问题?

【问题讨论】:

最后一个函数是在imaging 命名空间中定义的吗?如果不是,您必须使用imaging::Image edit您的问题与minimal reproducible example 或SSCCE (Short, Self Contained, Correct Example) 是的,它是在里面定义的。代码就像我发布的那样开始,“命名空间成像”,并且在运算符重载后括号关闭。 请发minimal reproducible example,否则无法诊断您的实际问题。 完成了,对不起,我不想让它变得太复杂。 【参考方案1】:

如您在此处看到的,运行您的代码时没有错误: https://ideone.com/NmJOpn

#include <iostream>
using namespace std;

namespace imaging

  class Image 
         
  public:

    int pixels;

    // constructors and destructor
    Image();                                                 // default: zero dimensions, nullptr for the buffer.   
    Image(unsigned int w, unsigned int h);
    Image(unsigned int w, unsigned int h, const int data_ptr);
    Image(const Image &src);
    ~Image();

    Image & operator = (const Image & right);


  ;



namespace imaging 

  Image::Image()

  Image::Image(unsigned int w, unsigned int h)  std::cout << "built Image!" << std::endl; 

  Image::Image(unsigned int w, unsigned int h, const int data_ptr)
  
    //memcpy(pixels, data_ptr, sizeof(data_ptr));
  

  Image::Image(const Image &src) 

  Image::~Image() 
    //if (pixels != nullptr) delete[] pixels;
  

  Image& Image::operator=(const Image& right) 
    //memcpy(pixels, right.pixels, sizeof(right.pixels));
    return *this;
  
 

int main() 
    imaging::Image wImage(1,2);
    return 0;

输出: built Image!

我也在VS2012中测试过。

看起来你在某处多了一个 。尝试剥离您的代码,看看是否仍有错误。

【讨论】:

正如我在 EDIT 上发布的那样,如果我将标头代码移至 .cpp,这个特定问题就会得到解决。但其他问题仍然存在,我认为这是根本原因。除了 Image.h,我还有 ppm_format.h。两者都包含“成像”命名空间的片段。 Ppm_format.h 使用 Image.h 中的一个函数,该函数返回一个“Image”对象。 Image.h 使用 ppm_format 中的另一个函数。因此,最初,我将每个标题都包含在彼此中,但这不起作用。我能做什么? 精简你的代码。隔离错误。我怀疑是什么 elase 导致了错误,并且您在此处没有提供足够的代码。 有多个错误。首先出现的是 ppm_format.h 不能识别“Image”对象,即使我包含 Image.h。你对我上面的评论有什么答案吗? 所以你有包含 ppm_format.h 的 Image.h 和包含 Image.h 的 ppm_format.h?循环依赖。 是的,这就是我看到的。但我解决了它,包括 .cpp 中的 ppm_format.h,一切都很好。【参考方案2】:

不过,我找到了解决方案。我必须将 ppm_format.h 不包含在 Image 的头文件中,而是包含在 .cpp 文件中,以避免相互包含两个头文件。

【讨论】:

以上是关于在命名空间中,如何定义从内部类返回对象的函数?的主要内容,如果未能解决你的问题,请参考以下文章

11.11函数对象,名称空间,作用域,命名关键字参数

关于PHP命名空间的讨论

python中怎样查看已加载的命名空间中所有变量和函数

使用在同一命名空间中定义的构造函数实例化命名空间中的对象。 C++

面向对象第八天----命名空间

如何从嵌套命名空间中引用外部 C++ 命名空间?