可以从模块导入 类,将它们用作私有基础 类,但不能重新导出?
Possible to import classes from a module, use them as private base classes, but not re-export?
我试图通过一些玩具示例来确保我正确理解模块。我认为相关的一个用例是实现隐藏,方法是使基础 class 不属于模块的导出部分。
使用 Visual Studio 16.11.2,以下代码的行为符合我的预期:
PublicModule.ixx:
export module PublicModule;
class PrivateImpl
{
protected:
int x = 7;
};
export class PublicClass : private PrivateImpl
{
public:
int getX() const { return x; }
};
main.cpp:
#include <iostream>
import PublicModule;
int main()
{
PublicClass pc;
std::cout << pc.getX() << '\n'; // Prints 7
// PrivateImpl pi; // This doesn't compile because PrivateImpl wasn't exported from PublicModule
}
但是,如果我尝试将 class PrivateImpl
移动到它自己的模块中,如下所示:
PrivateModule.ixx:
export module PrivateModule;
export class PrivateImpl
{
protected:
int x = 7;
};
PublicModule.ixx:
export module PublicModule;
import PrivateModule;
export class PublicClass : private PrivateImpl
{
public:
int getX() const { return x; }
};
main.cpp
#include <iostream>
import PublicModule;
int main()
{
PublicClass pc;
std::cout << pc.getX() << '\n'; // Prints 7
PrivateImpl pi; // This compiles, even though main.cpp doesn't import anything
// that (appears to) export PrivateImpl
}
我以为 import PrivateModule;
会从私有模块导入 PrivateImpl
,但 不会 重新导出它,因为我没有说 export import PrivateModule;
。而且我不认为仅导出 PublicClass
就足以导出其私人基地,因为第一个版本如我所料。
我是不是误解了模块导出的工作原理?
对于这两个示例,您的理解正确:这显然是一个编译器错误。名称查找不考虑名称是否 used 在其他一些翻译单元中。
我试图通过一些玩具示例来确保我正确理解模块。我认为相关的一个用例是实现隐藏,方法是使基础 class 不属于模块的导出部分。
使用 Visual Studio 16.11.2,以下代码的行为符合我的预期:
PublicModule.ixx:
export module PublicModule;
class PrivateImpl
{
protected:
int x = 7;
};
export class PublicClass : private PrivateImpl
{
public:
int getX() const { return x; }
};
main.cpp:
#include <iostream>
import PublicModule;
int main()
{
PublicClass pc;
std::cout << pc.getX() << '\n'; // Prints 7
// PrivateImpl pi; // This doesn't compile because PrivateImpl wasn't exported from PublicModule
}
但是,如果我尝试将 class PrivateImpl
移动到它自己的模块中,如下所示:
PrivateModule.ixx:
export module PrivateModule;
export class PrivateImpl
{
protected:
int x = 7;
};
PublicModule.ixx:
export module PublicModule;
import PrivateModule;
export class PublicClass : private PrivateImpl
{
public:
int getX() const { return x; }
};
main.cpp
#include <iostream>
import PublicModule;
int main()
{
PublicClass pc;
std::cout << pc.getX() << '\n'; // Prints 7
PrivateImpl pi; // This compiles, even though main.cpp doesn't import anything
// that (appears to) export PrivateImpl
}
我以为 import PrivateModule;
会从私有模块导入 PrivateImpl
,但 不会 重新导出它,因为我没有说 export import PrivateModule;
。而且我不认为仅导出 PublicClass
就足以导出其私人基地,因为第一个版本如我所料。
我是不是误解了模块导出的工作原理?
对于这两个示例,您的理解正确:这显然是一个编译器错误。名称查找不考虑名称是否 used 在其他一些翻译单元中。