c++ - 如何转发声明在未命名命名空间中的类

标签 c++

我正在尝试创建具有惰性计算的类。所以我需要结构来保存以前计算的变量,我想将该类放入未命名的命名空间(不想污染全局范围)。这是解释我想要什么的最小代码: 计算器.h:

#ifndef CALCULATOR_H
#define CALCULATOR_H

class PrevCalc;
class Calculator
{
public:
    Calculator();
    PrevCalc* prevCalc;
};

#endif // CALCULATOR_H

计算器.cpp:

#include "calculator.h"
namespace{
    struct PrevCalc{
        double prevA = -1;
        double prevB = -1;
        double prevC = -1;
    };
}
Calculator::Calculator()
{
    prevCalc = new PrevCalc();
}

当然它会给出一个错误 expected type-specifier before 'PrevCalc' 并且如果我定义 PrevCalc 没有命名空间一切正常。我的问题是如何声明将在 .cpp 文件中未命名的命名空间中定义的类

最佳答案

My question is how to declare class which will be defined in unnamed namespace in .cpp file

你不能。未命名的命名空间明确意味着对于它出现在其中的当前翻译单元是私有(private)可见的,并且本身不能用于前向声明。

使用 pimpl idiom 可能会更好, 如果您想隐藏实现细节。


另一种流行的方法是使用 internal_ 命名空间,并记录它不适合 public 使用:

namespace calculators {
namespace internal_ {
    struct PrevCalc{
        double prevA = -1;
        double prevB = -1;
        double prevC = -1;
    };
}

class Calculator {
public:
    Calculator();
private: // !!!!
    internal_::PrevCalc* prevCalc;
};
}

关于c++ - 如何转发声明在未命名命名空间中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33267839/

相关文章:

c++ - 将 2D 对象移动到 OpenGL 中的一个点

c++ - 循环遍历 vector 时将对象添加到 vector

c++ - C++ 是否有像 unique_ptr 这样具有 "destruct before constructing"语义的智能指针?

c++ - 我应该如何读取 FILE_NOTIFY_INFORMATION 结构中的文件名

c++ - 在我的C++ Builder应用程序中包括xmmintrin.h的问题

c++ - 初始化私有(private)静态变量c++

c++ - AMD OpenCL fatal error : CL/cl. hpp:没有这样的文件或目录

c++ - 过深的 C++ 类层次结构会导致堆栈溢出吗?

c++ - 为什么 C++ std::min_element 库函数接受采用 bool 返回类型的函数对象而不是像 C 中的 int 的仿函数?

c++ - 构建 clang 示例时出现 fatal error : 'type_traits' file not found #include <type_traits>,