主.cpp文件

时间:2017-06-15 18:24:52

标签: c++ templates

我使用template dependency injection来测试一个依赖于我无法改变的代码中的非虚方法的类。我想像以前一样maintain the class's declaration and definition separately。两种可能的模板实例在编译时都是已知的,这可能会减少膨胀/编译时间。如链接中所述,这可以通过在.cpp文件末尾显式实例化已知模板变体来完成:

// "Foo.cpp"
#include "Foo.h"
// definition of Foo<T>::f() etc.
template class Foo<Bar>;
template class Foo<MockBar>;

但是,这会在生产代码中引入测试引用。此外,如果我尝试转发声明MockBar我得到&#34;无效使用不完整类型&#34;错误。如果我从MockBar.h添加Foo.cpp,那么我需要确保我的构建过程也进行了调整,以包含并链接任何相关的测试代码Foo(例如gmock),这似乎是错误的。如果我将template class Foo<MockBar>实例化移动到Foo_test.cpp,那么我会在其上获得未定义的引用链接错误(但是对于预期的实例化没有错误)。我想我对实例化过程缺少了一些东西。

如何在保留单独的标题方法的同时分离测试和生产代码?

1 个答案:

答案 0 :(得分:1)

您可以以不同的方式拆分文件,并为您的测试提供实施访问权限,例如:

foo.h中

template <typename T> class Foo
{
    // member declaration ... 
};

Foo.inl

#include "Foo.h"

template <typename T>
void Foo::bar() { /*...*/ }

Foo.cpp中

#include "Foo.inl"
#include "Bar.h"

// Instantiations
template class Foo<Bar>;
// ...

在FooTest.cpp

#include "Foo.inl"
#include "MockBar.h"

template class Foo<MockBar>;

// Test Foo<MockBar> ...

所以普通用户只使用Foo.h 需要Foo定义(作为unittest)的用户包括Foo.inl Foo.inl可能是私人包含(不在“包”中提供)。

相关问题