我认为一个显式的实例化请求也会自动实例化所有基类成员,但我linker error: unresolved external symbol "public: void Base<int>::foo(int)"在使用Visual Studio 2008或2010构建此代码时得到了一个.
请注意,向foo()内部添加调用会bar()强制编译器实例化Base<int>::bar()并且构建成功,因此编译器似乎具有实例化所需的所有信息foo().
显然,Base<int>在source.cpp中显式实例化允许构建成功,但是在显式实例化派生类时,需要显式实例化任何依赖基类似乎很愚蠢.
这是正常的吗?我无法找到关于这个问题的标准.
header.h
template<typename T>
class Base {
public:
void foo();
};
template<typename T>
class Derived : public Base<T> {
public:
void bar();
};
Run Code Online (Sandbox Code Playgroud)
source.cpp
#include "header.h"
template<typename T>
void Base<T>::foo() { }
template<typename T>
void Derived<T>::bar() {
// this->foo(); // adding this forces instantiation of foo()???
}
template class Derived<int>;
Run Code Online (Sandbox Code Playgroud)
main.cpp中
#include "header.h"
int main() { …Run Code Online (Sandbox Code Playgroud)