C++ lnk2001错误-未解析的外部(C+;+;)

C++ lnk2001错误-未解析的外部(C+;+;),c++,inheritance,virtual,linker-errors,lnk2001,C++,Inheritance,Virtual,Linker Errors,Lnk2001,这将是一个棘手的问题,因为我无法发布任何真正的代码,但下面是: 我的继承形式为A->B->C,其中C是我正在编写的从B继承的类,B从A继承。A和B都是由其他人编写的,我无法更改它们(它们看起来是独立工作的)。我还有一个TestC类,它包含C.h,因为它创建了一个要测试的对象;C类为空,TestC只创建一个C对象。当我在Visual Studio 2013中构建我的TestC项目时,我得到lnk2001错误;如果我把#include C.h.注释掉,这些就消失了。C项目编译时没有问题 A.h #p

这将是一个棘手的问题,因为我无法发布任何真正的代码,但下面是:

我的继承形式为A->B->C,其中C是我正在编写的从B继承的类,B从A继承。A和B都是由其他人编写的,我无法更改它们(它们看起来是独立工作的)。我还有一个TestC类,它包含C.h,因为它创建了一个要测试的对象;C类为空,TestC只创建一个C对象。当我在Visual Studio 2013中构建我的TestC项目时,我得到lnk2001错误;如果我把#include C.h.注释掉,这些就消失了。C项目编译时没有问题

A.h
#pragma once
class A {
    public:
        A() {};
        virtual ~A() {};
        virtual int SomeGoodFunction() {return 0;};
        virtual int BadFunction() {return 0;}; //lnk 2001: unresolved external
    private:
        virtual int SomeOtherFunction() {};
        virtual int SomeOtherBadFunction() {}; //lnk 2001: unresolved external
};

B.h
#pragma once
namespace Model {
#include "A.h"
class B : public A {
    public:
        B() {}; //lnk 2019: unresolved external referenced in C()
        virtual ~B() {}; //lnk 2019: unresolved external referenced in ~C()
    private:
        void Bad() {}; //lnk 2001: unresolved external
        virtual ThisFunctionWorks() {};
        void SoDoesThis() {};
};}

C.h
#pragma once
#include "B.h"
class C : public B {
    friend class TestC;
    public:
        C() {};
        ~C() {};
        int Initialize() {};
};

TestC.h
#pragma once
#include "C.h"
namespace Model {
class TestC {
    int Test();
};
}

TestC.cpp
#pragma once
#include "TestC.h"
namespace Model {
int TestC::Test() {
    C test = C(); //if I comment out, builds just fine
    return 0;
}
}
(A.h&B.h有相应的.cpp,其中定义了事物,但我认为内容并不相关;它抱怨的每个函数都在.cpp中定义过(我可以单击“查看定义”,VS将跳转到它。请原谅任何语法错误;我将此作为psuedo代码编写,由于我在编译语法后收到链接器错误,我非常确定它们在原始代码中不存在。)

lnk2001错误表示,他们在A.h中找不到虚拟函数的定义,也找不到B.h的构造函数、解构器和一个函数(非虚拟)。我可以打开A&B的.h/.cpp文件,查看它抱怨被定义的函数。TestC的include目录中包含了这些函数吗(我可以通过点击#includes打开它们,这样它就工作了).Project dependencies是为构建顺序设置的。从编程的角度来看,C实际上不需要从B继承,但上级做出了决定,我的员工自己无法更改。我猜这与继承和/或虚拟函数的细微差别有关,我不知道

我遗漏了什么?我觉得我已经阅读了大多数堆栈溢出的文章


编辑:它们都在各自的项目中,除了TestC是一个.lib,TestC是一个.exe。当我在同一个项目中使用这些基本代码时,它编译时没有错误,所以我认为这是C和TestC项目之间的问题。

那么您定义了这些函数吗?源文件的内容非常相关,因为您似乎缺少这些文件中应该包含的定义。此外,您如何在类
B
中声明构造函数
a()
?请发布编译的代码(除了您询问的错误)。它抱怨的每个函数都是在类的对应的.cpp中定义的,但出于安全原因,我不允许发布这些复杂的代码。至于构造函数问题,这是复制/粘贴的错误。我很抱歉。如果这些函数真的被定义了(并且您正在链接定义它们的文件)那么很难猜出问题出在哪里。你能在你发布的内容中添加足够的代码来制作一个完整的测试用例吗?也就是说,即使所有的函数都有定义,它也会复制你看到的链接错误。你有真正的类模板吗?如果有,你的答案可能是: