我有一个简短的问题,希望有人知道我正在尝试的是否可行.
假设我有一个像这样的模板基类
template <class T>
CBase
{
public:
CBase() {}
void print() { std::cout << n std::endl; }
private:
T m_var;
};
Run Code Online (Sandbox Code Playgroud)
并且想要一个派生类,它使用自身作为模板参数从CBase派生:
class CDerived : public CBase<CDerived>
{
public:
CDerived () {}
};
Run Code Online (Sandbox Code Playgroud)
我有一个以这种方式构建的库,到目前为止,这个库是静态构建的,一切都很好.但现在我想将其更改为动态库,因此我为派生类添加了export/import关键字:
#if defined(BUILD_LIBRARY)
# define EXPORT __declspec(dllexport)
#else
# define EXPORT __declspec(dllimport)
#endif
class EXPORT CDerived : public CBase<CDerived>
{
public:
CDerived () {}
};
Run Code Online (Sandbox Code Playgroud)
这构建和链接很好,但只要我在可执行文件中使用CDerived,我就会收到有关CBase的链接器错误.未找到任何CBase方法或构造函数的参考.
我已经阅读了很多关于导出模板专业化的内容,但是这并没有帮助.似乎这种情况通常是可解决的,但由于我的派生类也是模板参数,因此可能存在问题.
有人可以告诉我这个特殊情况是否可以导出或根本不可能?
我是开发飞行模拟应用程序的团队的一员。其中一个应用程序也在 MacOS 上运行,需要访问麦克风才能与在线虚拟空中交通管制进行通信。从 MacOS 10.14 开始,麦克风访问不再有效。它曾经在任何以前版本的 MacOS 中都能完美运行。我读过从 10.14 开始,MacOS 会要求用户授予权限,但此对话框从未出现。使用portaudio作为音频库,成功打开音频输入流。没有警告,没有错误,没有任何指向问题的东西。它只是不返回任何音频输入。
我了解到许多其他项目——甚至是商业项目——也有类似的问题。但我不知道他们最终是如何解决这个问题的。我知道应用程序包需要在 Info.plist 中添加一个特定的键
<key>NSMicrophoneUsageDescription</key>
<string>This application needs access to your Microphone virtual ATC.</string>
Run Code Online (Sandbox Code Playgroud)
但这没有帮助。其他人建议添加<key>CFBundleDisplayName</key>解决问题。但它没有。
也许值得注意的是,该应用程序未签名。这是一个业余爱好项目,我不愿意每年为 Apple 的代码签名过程花费 99 美元。这可能是罪魁祸首吗?
欢迎任何建议或想法。
作为临时解决方法,我们告诉用户通过控制台从应用程序包启动二进制文件,从而解决了问题。但我也想为应用程序包本身正确修复它。