在命名空间中,如何定义从内部类返回对象的函数?
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 文件中,以避免相互包含两个头文件。
【讨论】:
以上是关于在命名空间中,如何定义从内部类返回对象的函数?的主要内容,如果未能解决你的问题,请参考以下文章