在没有模板的情况下声明函数模板实例化

时间:2014-10-02 04:32:43

标签: c++ templates

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

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

// 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 ++语言的抽象问题。我可以提供一个不编译的例子但这只是一种分心。

问题还在于专业化本身。模板是否专业化并不重要。此问题仅涉及声明模板存在且已实例化。

相关问题:How do I explicitly instantiate a template function? - 但是这并不能解决这个问题,因为它需要完整的模板定义才能看到。

2 个答案:

答案 0 :(得分:1)

您可以使用&#34; extern模板&#34;这里。它告诉编译器不要在每个转换单元中实例化它。这是C ++ 11增强功能的一部分。例如,我们可以将头文件a.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;
}

答案 1 :(得分:0)

要添加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);