我有一个继承自非模板父类的模板类Child。当我在多个 .cpp 文件中包含Child的标头时,我收到 LNK2005 错误。发生这种情况是因为Parent在多个编译单元中定义。当这些单元链接在一起时,它们会导致 LNK2005 错误。
如果您想知道,Parent的目的是为Child的所有Child实例提供一个静态变量,而不仅仅是为每个Child< ''type'' >提供一个。
我的问题是,如何创建一个具有唯一(跨所有子实例)静态变量并且可以包含在多个 .cpp 文件中的模板类?
这是导致此 LNK2005 错误的玩具示例:
主文件
#include "Apple.h"
#include "Banana.h"
#include <string>
void main() {
Apple apple;
Banana banana;
}
苹果.h
#ifndef APPLE_H
#define APPLE_H
struct Apple {
Apple();
};
#endif // APPLE_H
苹果.cpp
#include "Apple.h"
#include "Child.h"
Apple::Apple() {
Child<int> child;
child.foo(5);
}
香蕉.h
#ifndef BANANA_H
#define BANANA_H
struct Banana {
Banana();
};
#endif // BANANA_H
香蕉.cpp
#include "Banana.h"
#include "Child.h"
Banana::Banana() {
Child<double> child;
child.foo(3.14);
}
孩子.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
错误 LNK2005:“受保护:静态 int Parent::id”(?id@Parent@@1HA) 已在 Apple.obj 中定义