我使用Mingw在Window 7上提供的GCC 5.3.0,并使用gtest来实现和运行单元测试。
在我的项目中,我有一个计算机层次结构,它实现了如下所示的接口Computer
:
class Dataset; // Not
// Interface Computer
class Computer {
public:
// Destructor virtual to enable vmap
virtual ~Computer() noexcept = default;
// Pure virtual fonctions
virtual bool preCompute(Dataset &datas) const = 0;
virtual void compute(Dataset &datas) const = 0;
};
我将此接口的抽象实现提供为ChainableComputer
,它实现了另一个接口(Chainable
)和precompute
的默认实现。见下文。
class ChainableComputer : public Computer, public Chainable {
public:
bool preCompute(Dataset &dataset) const override;
};
这些类位于命名空间中,名为core
,并打包在core.dll
在另一个dll中,我在另一个名称空间ChainableComputer
中实现了domain
。
有些实现很简单,并且在preCompute中没有任何事情可做,因此,它们以相同的方式实现计算:
class SomeComputerImpl : public ChainableComputer{
/// ...
void compute(Dataset &datas) const override final{
auto result = preCompute(datas);
if(!result){
throw;
}
}
};
这段代码正在传播,所以我决定重构并在Computer中添加一个受保护的方法:
class Computer {
/// ...
protected:
// Helper function for some implementations of Computer
void doPrecomputeOrThrow(Dataset &datas) const{
auto result = preCompute(datas);
if(!result){
throw;
}
}
}
我不希望这种行为成为计算机的默认行为,但它让我有可能更改这些计算机的实现,如下所示:
class SomeComputerImpl : public ChainableComputer{
/// ...
void compute(Dataset &datas) const override final{
doPrecomputeOrThrow(Dataset &datas);
}
};
它在应用程序和单元测试中编译并运行良好...如果我在发布模式下编译并运行。
如果我选择Debug,编译工作,应用程序工作,但测试不会。
我试着理解它会发生什么,但我无法弄清楚可能出现的问题。我想它与链接器有关,并且接口,抽象实现和具体实现是分离DLL的事实,我们在另一个可执行文件中运行这些东西......
ChainableComputer
按预期工作inline
=>上播放__attribute__(always_inline)
或doPrecomputeOrThrow
没效果doPrecomputeOrThrow
(将计算机*作为参数传递),在core.dll =>中没效果doPrecomputeOrThrow
(将计算机*作为参数传递),在domain.dll =>中按预期工作doPrecomputeOrThrow
作为模板实施,Computer
作为模板参数(参见下文)=>按预期工作在课堂上实施doPrecomputeOrThrow
作为模板,Dataset
作为模板参数(见下文)=>没效果
//作为Computer
(静态或非静态)成员的工作模板,或
//在命名空间中
模板
void doPrecomputerOrThrows(AComputer * c,Dataset& datas);
//作为Computer
成员的模板不起作用
模板
void doPrecomputerOrThrows(ADataset& datas);
有人知道会发生什么事吗?