声明不带模板的函数模板实例化



是否可以声明符号是函数模板的显式实例化,而无需首先定义函数模板?

它会向编译器表示,在另一个翻译单元中存在一个在某个地方实例化的函数模板,我们想调用实例化的函数。

// declaration of instantiation, perhaps it would look like one of these:
// template<typename> void foo(int);
// template<typename> void foo<int>(int);
void bar(int i) {
    // definition of function unknown to caller, it shouldn't matter
    foo(i);
    // either that or this perhaps:
    foo<int>(i);
}

这是不是有技术原因不能做到,还是只是因为缺乏语法?是否存在无法在声明中提供足够信息来生成对实例化函数模板的调用的原因?

这个X后面没有Y。这个问题是字面意思。这是一个关于C++语言的抽象问题。我可以提供一个不编译的例子,但这只会分散注意力。

问题也不在于专业化本身。模板是否专业化并不重要。这个问题只涉及声明一个模板存在并且它是实例化的。

相关问题:如何显式实例化模板函数?-然而,这并不能解决这个问题,因为它需要完整的模板定义是可见的。

您可以在此处使用"extern template"。它告诉编译器不要在每个翻译单元中实例化它。这是C++11增强功能的一部分。例如,我们可以将头文件.hpp中的模板声明为

// a.hpp
template <class T>
T fun(T& a);

然后在a.cpp 中

// a.cpp
#include "a.hpp"
extern template int fun(int&);
int main()
{
   int a = 100;
   return fun(100);
}

在b.cpp中,我们实际上可以实例化模板:

// b.cpp
#include "a.hpp"
template <>
int fun(int& x)
{
    return x + 1;
}

要添加到Nipun Talukdar的答案中,不需要专门化或模板定义对调用方可见。

a.cpp

template<class T> T fun(T);
extern template int fun(int);
int main() {
    // this works, even though we have no idea how fun() is defined
    fun(100);
    // this would fail to link
    // fun('a');
}

b.cpp

template<class T>
T fun(T x) {
    return x;
}
// explicit instantiation
template int fun<int>(int x);

最新更新