当前位置: 首页 > 知识库问答 >
问题:

使用模板成员数据

堵才哲
2023-03-14

我试图使用基于模板的类作为另一个类的成员。另一个类将根据其数据成员值决定基于模板的成员应该使用的数据类型。为此,我使用了一点多态性来决定实例化的运行时。

class Base
{
public:
    virtual void print() = 0;
};

template <typename T>
class templateDynamic : public Base
{
public:
    templateDynamic();
    ~templateDynamic();
    void print();
};

    template <typename T>
templateDynamic<T>::templateDynamic()
{
}

template <typename T>
templateDynamic<T>::~templateDynamic()
{
}

template <typename T>
void templateDynamic<T>::print()
{

}

class Holder
{
private:
    Base * m_ABC;
public:
    Holder(int a);  
    void print();
};

void Holder::print()
{
    m_ABC->print();
}

Holder::Holder(int a)
{
    if(a == 1)
      m_ABC = new templateDynamic<int>();
    else
      m_ABC = new templateDynamic<float>();
}

int main()
{
    Holder aHolder(1);
    aHolder.print();
    Holder aHolder2(2);
    aHolder.print();
}

然后,打印函数将根据 T 的类型进行打印,它是 int 还是 float。此时我收到链接器错误。

错误LNK2019:未解析的外部符号" public:_ this call template dynamic::template dynamic(void)"(??0?$templateDynamic@H@@QAE@XZ)在函数“public:_ _ this call Holder::Holder(void)”中引用(??0Holder@@QAE@XZ)

共有1个答案

东门新立
2023-03-14

您尚未为templateDynamicHolder定义构造函数

 类似资料:
  • 我有一个模板化的C++类,它也有一个模板化的成员函数。这个成员函数的模板参数以特定的方式依赖于类的模板参数(请参阅下面的代码)。我正在为其模板参数的两个不同值实例化(而不是专门化)该类。一切都在这一点上进行。但是,如果我调用模板化的成员函数,对第一个实例化对象的调用只会编译,而不会编译第二个。似乎编译器没有为模板类的第二次实例化实例化模板化成员函数。我正在使用“g++filename.cpp”编译

  • 是否有人知道此显式特化是否有效: clang 主干 (12/3/2013) 给出以下错误: f:...\test.cpp:36:20: 错误: 从类 'O' 中出线定义 “Fun” 没有定义 1生成错误。 任何来自标准的支持参考来证明你的答案将不胜感激! 注意:我有点惊讶这是一个错误——我认为应该为任何以< code >开始实例化“Fun”的模板参数族选择专门化 这是一个叮当的错误还是我期望中的错

  • 我希望一个类有两种不同的实现,并根据布尔模板参数进行选择。我尝试使用本答案中描述的SFINAE原则,如下所示: 然而,我在gcc下遇到了一个错误“不能在类范围内专门化函数”,我不明白为什么。虽然我的代码与链接答案中的代码并不完全相同,但它似乎非常相似,我无法发现关键的区别。 我还尝试使用类似于此答案中建议的语法,但也不起作用(错误是“不能重新声明类成员”): 我怎样才能做到这一点?

  • 在非模板类中,类的所有对象共享一个 static 数据成员,Static 数据成员应在文件范围内初始化。 从类模板实例化的每个模板类有自己的类模板 static 数据成员,该模板类的所有对象共享一个 Static 数据成员。和非模板类的 static 数据成员一样,模板类的 static 数据成员也应在文件范围内初始化。每个模板类有自己的类摸板的 static 数据成员副本。

  • 我有一个问题,我想在下面的代码中专门化模板类的模板成员函数。这个问题的答案是模板类成员函数的显式特化,这似乎表明它无法完成。这是正确的吗,如果是这样,我可以使用任何解决方法,以便在编译时通过内联inc函数进行扩展? 非常感谢! g吐槽道: test2.cpp:32:13: 错误: 非命名空间作用域中的显式专用化 'struct IdxIterator' test2.cpp:32:25: 错误: 非

  • 我一直试图理解C++选择模板的方式。即,考虑以下代码示例: 前两个函数(test1)工作正常(为什么?): 一个常见的错误是声明两个仅在默认模板参数上不同的函数模板。这是非法的,因为默认模板参数不是函数模板签名的一部分,并且用相同的签名声明两个不同的函数模板是非法的。 所以看起来是这样的。但是,我看不出与前两个函数有太大的不同,前两个函数也有默认的模板参数。因此,我们对默认值(test1-work