2014-10-02 103 views
2

是否有可能声明符号是函数模板的显式实例化,而不首先定义函数模板?在没有模板的情况下声明函数模板实例化

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

// 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? - 但是这并没有解决这个问题,因为它需要完整的模板定义是可见的。

+0

什么是你想在这里实现更高水平的目标是什么?您可能需要更清楚地说明您的示例 - 确切地说哪些行不通?我现在大约有70%清楚你现在要问什么。 :) – 2014-10-02 04:34:16

+0

请注意,如果您只需要调用该函数,则声明明确的实例化是多余的。这是正确的并且实例化:'template void foo(T t); void bar(){foo(5); }' – 2014-10-02 04:49:40

+0

@MattMcNabb我在这个问题的初稿中实际上有一个关于这个问题的链接,但认为它是无关紧要的。 – Praxeolitic 2014-10-02 04:49:52

回答

1

你可以在这里使用“extern template”。它告诉编译器不要在每个翻译单元中实例化它。这是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; 
} 
+0

整洁。似乎也使用明确的实例化。但模板定义仍然必须可见。我不明白为什么。 – Praxeolitic 2014-10-02 05:51:08

+0

实验后:如果您转发声明模板并进行extern模板声明,则不需要模板定义对调用者可见。 – Praxeolitic 2014-10-02 05:59:08

+0

在'b.cpp'中,你有一个明确的'fun'函数模板专门化而不是实例化。明确的专业化应该在第一次使用之前进行声明,这样你的代码就不合格了。 – Constructor 2014-10-02 12:23:26

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); 
相关问题