Visual C ++ 2015不会编译模板化代码

时间:2015-12-07 17:46:06

标签: c++ templates visual-c++ visual-studio-2015

以下内容无法使用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的第二个模板参数,并且如果我在它编译的foo()类中定义Thing<T>。那么这是一个VS bug呢?如何修改上面的内容,使其在VS2015中编译,而不在类中定义foo()?错误消息指出&#34;无法将函数定义与现有声明匹配&#34;。

3 个答案:

答案 0 :(得分: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;}

注意函数的返回类型。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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;
}

你可以帮助读者。