C++ 声明没有模板的函数模板实例化

C++ 声明没有模板的函数模板实例化,c++,templates,C++,Templates,是否可以声明符号是函数模板的显式实例化,而不首先定义函数模板 它会向编译器表示,在另一个在某处实例化的翻译单元中存在一个函数模板,我们希望调用实例化的函数 // declaration of instantiation, perhaps it would look like one of these: // template<typename> void foo(int); // template<typename> void foo<int>(int);

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

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

// 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);
}
//实例化的声明,可能看起来像:
//模板无效foo(int);
//模板无效foo(int);
空栏(int i){
//调用方不知道函数的定义,这不重要
富(i),;
//要么是这样,要么是这样:
富(i),;
}
这是因为技术原因,还是因为缺少语法?在声明中不能提供足够的信息来生成对实例化函数模板的调用,这有什么原因吗

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

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

相关问题:-但这并不能解决此问题,因为它要求完整的模板定义可见。

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

// a.hpp
template <class T>
T fun(T& a);
在b.cpp中,我们可以实际实例化模板:

// b.cpp
#include "a.hpp"

template <>
int fun(int& x)
{
    return x + 1;
}
//b.cpp
#包括“a.hpp”
模板
int-fun(int&x)
{
返回x+1;
}

要添加到Nipun Talukdar的答案中,不需要专门化,也不需要让调用者看到模板定义

a、 cpp

模板T乐趣(T);
外部模板int-fun(int);
int main(){
//这是可行的,尽管我们不知道fun()是如何定义的
乐趣(100);;
//这将无法联系起来
//乐趣(“a”);
}
b、 cpp

模板
T乐趣(T x){
返回x;
}
//显式实例化
模板int-fun(int-x);

您在这里试图实现的更高级别目标是什么?您可能需要更明确地介绍您的示例——确切地说,什么不起作用?我对你现在提出的问题大约有70%的了解。:)请注意,如果只需要调用函数,则声明显式实例化是多余的,例如,这是正确的,并实例化:
template void foo(T);void bar(){foo(5);}
@MattMcNabb我在这个问题的初稿中实际上有一个与这个问题的链接,但认为它是无关的。评论在编辑中解决。@MattMcNabb如果这不可能,那么问题是为什么。关键的部分是模板已经用已知的parameters.Neat实例化。似乎也可以使用显式实例化。但模板定义仍然必须可见。我不明白为什么。在实验之后:如果你向前声明模板并进行外部模板声明,你不需要模板定义对调用方可见。在
b.cpp
中,你有一个
fun
函数模板的显式专门化,而不是实例化。并且显式专门化应该在第一次使用它之前声明,因此您的代码格式不正确。@Constructor yes。我只是试图解释一下新的增强功能,即使用C++11可以避免每个翻译单元中的实例化,这与问题有关。
// b.cpp
#include "a.hpp"

template <>
int fun(int& x)
{
    return x + 1;
}
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');
}
template<class T>
T fun(T x) {
    return x;
}

// explicit instantiation
template int fun<int>(int x);