【问题标题】:C++: Compilation Errors for Custom Coded Generic Container?C++:自定义编码通用容器的编译错误?
【发布时间】:2009-11-28 15:26:24
【问题描述】:

以下内容基于我在this thread 上发布的代码。除了明显的错误,我得到以下编译错误?知道为什么吗?

奇怪的是,这只发生在模板类中。如果我将另一个非模板类添加到模板类的同一个 .h 和 .cpp 文件中并尝试仅实例化非模板类,则不会生成错误。

场景A:

我收到以下代码的编译错误“error C2659: '=': 重载函数作为左操作数”:

StdVector<int> a();
StdVector<int> b();
a = b;

场景 B:

我得到编译错误“ error C2664: '__thiscall StdVector::StdVector(const class StdVector &)' : cannot convert parameter 1 from 'class StdVector (__cdecl *)(void)' to 'const class StdVector &'" 用于以下代码:

StdVector<int> a();
StdVector<int> b(a);

场景 C:

我得到编译错误 "error LNK2001: unresolved external symbol "public: __thiscall StdVector::~StdVector(void)" (??1?$StdVector@H@@QAE@XZ) " 如下代码:

StdVector<int> a;

【问题讨论】:

    标签: c++


    【解决方案1】:
    StdVector<int> a();
    StdVector<int> b();
    

    这些是函数声明。省略括号以声明默认构造的实例。

    【讨论】:

      【解决方案2】:

      您将 a 和 b 声明为返回 StdVector 的函数。我认为这不是你想要的。将功能分配给功能意味着什么?也许你的意思是:

      StdVector<int> a;
      

      【讨论】:

      • 当我尝试你的建议时,我已经编辑了错误的帖子。
      【解决方案3】:

      正如前面的答案所说,在场景 A 和 B 中,您实际上是在声明函数而不是实例化对象实例。这被称为“C++ 最令人头疼的解析”。更多讨论请见this question

      如果没有查看您的类的实际源代码,很难判断为什么方案 C 不起作用,但是链接器告诉您它无法找到 StdVector 的析构函数。它说它是一个“未解析的外部符号”,这意味着它在编译时没有定义,并且它假设或被明确告知该定义在其他文件中。当需要将所有目标文件链接到单个可执行文件中时,它找不到析构函数的目标代码,这就是您收到该错误的原因。这并没有为您提供解决问题的简单方法,但至少您知道从哪里开始寻找。

      【讨论】:

      • 我强烈怀疑这是由于在虚拟化环境下运行的 VC++6 编译器造成的。将确认这一点!
      【解决方案4】:

      如果我没记错的话,模板是不能导出的。这就是我在场景 C 中遇到链接器错误的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        相关资源
        最近更新 更多