Visual C++ 2015 不会编译模板代码 [关闭]

Posted

技术标签:

【中文标题】Visual C++ 2015 不会编译模板代码 [关闭]【英文标题】:Visual C++ 2015 won't compile templated code [closed] 【发布时间】:2015-12-07 17:46:05 【问题描述】:

以下内容无法与 VS 2015 一起编译:

template <typename T, typename U>
struct Tree 
    struct Node ;
;

template <typename T>
struct Thing : public Tree<T, int> 
    typename Tree<T, int>::Node* foo();
;

template <typename T>
typename Tree<T, int>::Node* Thing<T>::foo() return nullptr;

int main() 

但是如果我删除Tree 的第二个模板参数,它会编译,如果我在Thing&lt;T&gt; 类中定义foo(),它会编译。所以这是一个VS错误对吗?如何修改上述内容以使其在 VS2015 中编译,而不在类中定义 foo()?错误消息指出“无法将函数定义与现有声明匹配”。

【问题讨论】:

您应该告诉我们确切的错误信息是什么。此外,它也不在这里编译:ideone.com/YZVMJp The following code似乎被VS接受了 那我不明白。我的 Visual Studio 2015 不会完全编译上面的内容。但是,如果我在它编译的任何地方删除模板 U。 Here's one more 替代 啊!感谢您提供这个替代方案。现在它编译了。我不知道为什么我的 VS2015 需要它,但至少现在它可以工作了。 【参考方案1】:

我相信,您的代码中有错字。以下编译:

template <typename T, typename U>
struct Tree 
    struct Node ;
;

template <typename T>
struct Thing : public Tree<T, int> 
    typename Tree<T, int>::Node* foo();
;

template <typename T>
typename Tree<T, int>::Node* Thing<T>::foo() return nullptr;

注意函数的返回类型。

【讨论】:

我在这里打错了,但我在我的程序中打错了。以上内容无法与我的 Visual Studio 2015 一起编译。错误消息指出“无法将函数定义与现有声明匹配”。但是,如果我删除 Tree 的第二个模板参数,它就会编译,如果我在 Thing 类中定义 foo() ,它就会编译。【参考方案2】:

真正需要的只是第一个模板。更新使编译器创建模板到您的程序生命周期结束。一些不是最新的课程仍然教导为您正在使用的任何方法创建每个新模板,但根本不需要。所以这不仅仅是一个VS“错误”。

【讨论】:

【参考方案3】:
template <typename T, typename U>
struct Tree 
    struct Node ;
;

template <typename T>
struct Thing : public Tree<T, int> 
    typedef typename Tree<T, int>::Node Node;
    Node* foo();
;

template <typename T>
typename Thing<T>::Node*  Thing<T>::foo() return nullptr;

int main() 
    Thing<int> i;

你可以帮助读者。

【讨论】:

以上是关于Visual C++ 2015 不会编译模板代码 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 2015 中成功导出 C++ 项目模板?

编译和链接项目时 Visual Studio 2015 挂起

在 Visual Studio 2015 解决方案中实现 C++ 模板的正确方法是啥?

如何使用我下载的 Visual Studio 编译 C++ 源代码 [关闭]

Visual Studio 2015 Update 1 中的 C++ 内部编译器错误

Python 3,如何设置 Visual Studio C++ 2015 编译器?