【问题标题】:function is not found when instantiate a template function in VS2017VS2017实例化模板函数时找不到函数
【发布时间】:2019-02-20 22:26:11
【问题描述】:

这可能是一个愚蠢的问题,但我完全不知道提示。

代码在 .cpp 文件中

template <typename T> void foo2(T){}
template void foo2<int>(int);

VS2017 一直告诉我:找不到函数 'foo2' 的函数定义。但是,该代码实际上可以在 VS2017 中运行,如果我运行它没有错误消息。我不知道这是特定于 IDE 的问题还是代码问题。由于它很烦人,有谁知道为什么会出现提示以及如何解决它?谢谢!

=========更新===========

这是完整的代码(将实例移动到 .h 文件但仍然有同样的问题):

测试.h

#pragma once
template <typename T> void foo2(T);
template void foo2<int>(int);

test.cpp

#include "test.h"
#include "stdafx.h"
template <typename T>void foo2(T){}

主文件

#include "stdafx.h"
#include "test.h"

int main()
{
    int a = 1;
    foo2(a);
}

我倾向于相信一个特定于 IDE 的问题。如果我要求 VS 显示潜在的修复,它将在 .cpp 文件中创建以下代码:

template void foo2(int)
{
    return template void();
}

这绝对是错误的。连编译都过不了。

【问题讨论】:

  • foo2 forward 声明了吗?模板在实例化之前需要完全定义,以便编译器知道如何实例化。见stackoverflow.com/questions/495021/…
  • 感谢您的回复,我在对应的.h文件中做了声明,并且头文件已经包含在.cpp文件中。主要功能位于单独的 .cpp 文件中,并且包含 foo2 的 .h。这三个是项目中唯一的文件。事实上,即使我将实例化放在 .h 文件中,我也会得到相同的提示。我让 VS 修复它,VS 会为它创建一个空的函数定义。我不明白这怎么会发生..
  • 请在问题中包含您的所有文件以帮助说明。您的完整模板定义需要in包含在头文件中。
  • 代码没问题,IDE 的行为很有趣。请求 Microsoft 修复它。
  • 我很确定实际的错误信息是不同的。 MSVC 可能在模板方面存在一些小问题,但它 100% 肯定知道 foo2 不是一个函数,因此它不会抱怨找不到它的定义。现在foo2&lt;int&gt; 是一个缺少定义的函数,所以我可以看到 MSVC 抱怨这一点。

标签: c++ visual-studio templates


【解决方案1】:

通过扩展代码,我明白了。

您实际上想要 .h 文件中的 extern template void foo2&lt;int&gt;(int);。在 test.cpp 中应该只有一个实例化。 extern template 是 C++11 中的新内容,所以虽然你的书可能还没有涵盖它,但 VS2017 肯定能理解它。

【讨论】:

  • 感谢您的回答,我尝试了您的建议,但得到了相同的提示。很遗憾它不起作用。我已将其报告给 MS。让我们看看他们会如何回应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多