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