模板特化中对基 class 成员的未定义引用
Undefined reference to base class member in template specialization
我创建了一个模板 class (ABase),然后将 class(添加一些额外功能)扩展到派生的 class (A)。派生的 class 也是特化的。但是,当我在专门的派生 class 中引用基 class 的成员时,我得到一个 linker 错误,指出存在对基 class 成员的未定义引用。
代码布局如下:
ABase.h:
#include <vector>
namespace A {
template<typename T>
class ABase {
private:
std::vector<T> items;
public:
ABase(){};
void addItem(T item);
};
}
ABase.cpp:
#include "ABase.h"
namespace A {
template<typename T>
void ABase<T>::addItem(T item) {
items.push_back(item);
}
}
A.h:
#include <string>
#include "ABase.h"
namespace A {
class A : public ABase<std::string> {
public:
void foo(std::string item);
};
}
A.cpp:
namespace A {
void A::foo(std::string item) {
//do some extra stuff
ABase::addItem(item);
}
template class ABase<std::string>;
}
main.cpp:
#include <string>
#include "A.h"
using namespace std;
int main() {
A::A a;
string item = "hello";
a.foo(item);
}
我搜索过类似的问题如:
- Undefined reference to partial specialized template class function during link time
哪个推荐加
template class ABase<std::string>;
到 A.cpp 的底部,但是如上所述,我已经尝试过了,但它似乎不起作用。我该怎么做才能达到 link。它确实可以编译,但是 returns:
./src/A.o: In function `A::A::foo(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
/test-proj/Debug/../src/A.cpp:14: undefined reference to `A::ABase<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::addItem(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
collect2: ld returned 1 exit status
make: *** [test-proj] Error 1
在 linking 时。感谢您的帮助!
如果将 addItem 的实现移动到 ABase.h header 中,应该可以编译。像这样:
#include <vector>
namespace A
{
template<typename T>
class ABase
{
private:
std::vector<T> items;
public:
ABase(){};
void addItem(T item)
{
items.push_back(item);
};
};
}
ABase.cpp 文件将变得多余(除非您有其他方法实现)
我创建了一个模板 class (ABase),然后将 class(添加一些额外功能)扩展到派生的 class (A)。派生的 class 也是特化的。但是,当我在专门的派生 class 中引用基 class 的成员时,我得到一个 linker 错误,指出存在对基 class 成员的未定义引用。
代码布局如下:
ABase.h:
#include <vector>
namespace A {
template<typename T>
class ABase {
private:
std::vector<T> items;
public:
ABase(){};
void addItem(T item);
};
}
ABase.cpp:
#include "ABase.h"
namespace A {
template<typename T>
void ABase<T>::addItem(T item) {
items.push_back(item);
}
}
A.h:
#include <string>
#include "ABase.h"
namespace A {
class A : public ABase<std::string> {
public:
void foo(std::string item);
};
}
A.cpp:
namespace A {
void A::foo(std::string item) {
//do some extra stuff
ABase::addItem(item);
}
template class ABase<std::string>;
}
main.cpp:
#include <string>
#include "A.h"
using namespace std;
int main() {
A::A a;
string item = "hello";
a.foo(item);
}
我搜索过类似的问题如:
- Undefined reference to partial specialized template class function during link time
哪个推荐加
template class ABase<std::string>;
到 A.cpp 的底部,但是如上所述,我已经尝试过了,但它似乎不起作用。我该怎么做才能达到 link。它确实可以编译,但是 returns:
./src/A.o: In function `A::A::foo(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
/test-proj/Debug/../src/A.cpp:14: undefined reference to `A::ABase<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::addItem(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
collect2: ld returned 1 exit status
make: *** [test-proj] Error 1
在 linking 时。感谢您的帮助!
如果将 addItem 的实现移动到 ABase.h header 中,应该可以编译。像这样:
#include <vector>
namespace A
{
template<typename T>
class ABase
{
private:
std::vector<T> items;
public:
ABase(){};
void addItem(T item)
{
items.push_back(item);
};
};
}
ABase.cpp 文件将变得多余(除非您有其他方法实现)