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