C++ 模板、链接器错误和设计模式

问题描述 投票:0回答:1

请注意:这段代码可能看起来过于复杂,或者引发了有关 Convert 函数如何执行的进一步问题,但我故意只展示一个非常小的示例,并且我想要做的事情的类型数量和复杂性确实值得这种性质的东西。我也知道 C++ 不支持运行时反射,这可能是下一个明显的评论。

本质上,我正在尝试实现一个 TypeConverter,它具有许多成员函数,允许它返回从一种类型转换为另一种类型的结果。 TypeConverter 本身声明并实现所需的具体函数,但每个函数的实现可以使用不同的帮助器,例如 StructConverter。帮助者本身需要访问 TypeConverter 来帮助转换他们作为成员/子对象持有的任何复杂类型。 StructConverter 本身是一个模板,因此可以是通用的,尽管某些部分需要特定的实现。

但是,我不断收到链接器错误: ld:未定义的符号: StructConverter::StructConverter(),引用自: main-90b08f.o 中的 TypeConverter::TypeConverter() clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

最初我认为前向类声明就足够了,但显然不是,我一直无法弄清楚我想要做的事情是否不可能(尽管对我来说,它在概念上似乎很好)或者我是否只是还没有找到合适的 C++ 构造。

提前非常感谢您在构建此过程中提供的任何帮助,或建议一种不太相似的方法,这可能有助于注意到使用 StructConverter 或类似的模板对于我的设计/期望的结果有些关键。

#include <string>

struct StructTypeA{
    int time;
    std::string source;
};

struct StructTypeB{
    int time;
    std::string source;
};

class TypeConverter;
  
template <typename A, typename B>
class StructConverter   
{
public:
    StructConverter();
    A Convert(B b, TypeConverter &tc)
    {
        A a;
        a.source = b.source;
        a.time = b.time;
        // a.SomeMoreComplexType = tc.Convert(b.ComplexType);
        return a;
    }
};

class TypeConverter
{
  private:
    StructConverter<StructTypeA, StructTypeB> sconverter;

  public:
  StructTypeA Convert(StructTypeB b, TypeConverter &tc)
  {
    return sconverter.Convert(b, tc);
  }
};

int main()
{
        TypeConverter tc;
        StructTypeB b;
        b.source = "somewhere";
        b.time = 5;
        StructTypeA a = tc.Convert(b, tc);

        return 0;
}
c++ c++11 c++14
1个回答
0
投票

您声明了一个默认构造函数,

StructConverter()
,但没有在任何地方定义它。仅此而已。

© www.soinside.com 2019 - 2024. All rights reserved.