C++ 带有非模板基的模板化类给了我一个LNK2005错误

C++ 带有非模板基的模板化类给了我一个LNK2005错误,c++,templates,inheritance,lnk2005,C++,Templates,Inheritance,Lnk2005,我有一个模板类子类,它继承自一个非模板类父类。当我在多个.cpp文件中包含子文件的头时,我得到一个LNK2005错误。这是因为在多个编译单元中定义了父级。当这些装置连接在一起时,会导致LNK2005错误 如果您想知道,Parent的目的是为所有Child实例提供一个静态变量,而不仅仅是为每个Child提供一个静态变量 我的问题是,如何创建一个模板类,该类具有唯一的(在所有子实例中)静态变量,并且可以包含在多个.cpp文件中 以下是导致此LNK2005错误的玩具示例: main.cpp #incl

我有一个模板类子类,它继承自一个非模板类父类。当我在多个.cpp文件中包含子文件的头时,我得到一个LNK2005错误。这是因为在多个编译单元中定义了父级。当这些装置连接在一起时,会导致LNK2005错误

如果您想知道,Parent的目的是为所有Child实例提供一个静态变量,而不仅仅是为每个Child提供一个静态变量

我的问题是,如何创建一个模板类,该类具有唯一的(在所有实例中)静态变量,并且可以包含在多个.cpp文件中

以下是导致此LNK2005错误的玩具示例:

main.cpp

#include "Apple.h"
#include "Banana.h"

#include <string>

void main() {
    Apple apple;
    Banana banana;
}
#include "Apple.h"
#include "Child.h"

Apple::Apple() {
    Child<int> child;
    child.foo(5);
}
#include "Banana.h"
#include "Child.h"

Banana::Banana() {
    Child<double> child;
    child.foo(3.14);
}
Apple.cpp

#include "Apple.h"
#include "Banana.h"

#include <string>

void main() {
    Apple apple;
    Banana banana;
}
#include "Apple.h"
#include "Child.h"

Apple::Apple() {
    Child<int> child;
    child.foo(5);
}
#include "Banana.h"
#include "Child.h"

Banana::Banana() {
    Child<double> child;
    child.foo(3.14);
}
Banana.cpp

#include "Apple.h"
#include "Banana.h"

#include <string>

void main() {
    Apple apple;
    Banana banana;
}
#include "Apple.h"
#include "Child.h"

Apple::Apple() {
    Child<int> child;
    child.foo(5);
}
#include "Banana.h"
#include "Child.h"

Banana::Banana() {
    Child<double> child;
    child.foo(3.14);
}
#包括“Banana.h”
#包括“Child.h”
香蕉::香蕉(){
儿童;
child.foo(3.14);
}
Child.h

#ifndef APPLE_H
#define APPLE_H

struct Apple {
    Apple();
};

#endif // APPLE_H
#ifndef BANANA_H
#define BANANA_H

struct Banana {
    Banana();
};

#endif // BANANA_H
#ifndef CHILD_H
#define CHILD_H

#include <iostream>

using namespace std;

///////////// Parent Class Def ///////////

class Parent {
    protected:
    static int id;
};

int Parent::id = 0;

///////////// Child Class Def ///////////

template <class T>
struct Child : protected Parent {
    Child();
    void foo(T t);
};

template <class T>
Child<T>::Child() {
    id++;
}

template <class T>
void Child<T>::foo(T t) {
    cout << "Child" << id << "'s foo() says: " << t << endl;
}

#endif // CHILD_H
\ifndef CHILD\u H
#定义子对象
#包括
使用名称空间std;
/////////////父类定义///////////
班级家长{
受保护的:
静态int-id;
};
int Parent::id=0;
/////////////子类定义///////////
模板
结构子级:受保护的父级{
Child();
void foo(T);
};
模板
Child::Child(){
id++;
}
模板
无效子对象::foo(T){

cout您需要在
Child.C
中只定义一次
int Parent::id=0;
。通过将其包含在头文件中,可以为包含头文件的每个文件定义一次

我想我应该注意到,把它放在
Parent.C
(匹配类名)中的弊病或者
Child.C
匹配标题名,我选择了一致性。更好的方法是将
Parent
放在它自己的文件中,这样您就可以将定义放在一个名称恰当的
Parent.C
中,它仍然匹配相应的标题名。

int Parent::id = 0;

进入
Parent.cpp
,你会没事的。现在的情况是,每个包含
Child.h

的翻译单元都会包含一次定义。我想我需要学习更快的打字速度。+1正是因为如此。:PAhh我应该想到这一点。谢谢!