【问题标题】:'T' is not a valid template type argument for parameter 'T'“T”不是参数“T”的有效模板类型参数
【发布时间】:2015-09-10 01:25:57
【问题描述】:

我编写了一个程序,使用类将排序数组转换为 C++ 中的 BST。我收到以下错误:

error C2143: syntax error : missing ';' before '*'

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

error C2065: 'T' : undeclared identifier

error C2923: 'Binary_Search_Tree' : 'T' is not a valid template type argument for parameter 'T'

以下是我的程序:

template <class T>
class Binary_Search_Tree {
public:
    struct Bst_Node {
        T value;
        Bst_Node* left;
        Bst_Node* right;
    };

    Bst_Node* root;

    Binary_Search_Tree();

    Bst_Node* sortedarraytobst(T* A, int start, int end);
};

template <class T> Binary_Search_Tree<T>::Binary_Search_Tree() {
    root = nullptr;
    std::cout << "Constructor called" << std::endl;
}

template <class T> Bst_Node* Binary_Search_Tree<T>::sortedarraytobst(T* A, int start, int end) {

    if(start > end)
        return NULL;

    int mid = start + (end - start)/2;
    Bst_Node* newnode = new Bst_Node();
    newnode->value = A[mid];
    newnode->left  = sortedarraytobst(A,start,mid-1);
    newnode->right = sortedarraytobst(A,mid+1,end);

    return newnode;
}

int main()
{
    Binary_Search_Tree<int> tree;
    int Array[10] = {1,2,5,6,8,9,12};
    int n = sizeof(Array)/sizeof(Array[0]);
    tree.root = tree.sortedarraytobst(Array,0,n-1);

    return 0;
}

请求这方面的帮助。我发现模板的使用非常混乱。

【问题讨论】:

    标签: c++ class templates


    【解决方案1】:

    sortedarraytobst 实现的返回值中,应将Bst_Node* 替换为typename Binary_Search_Tree&lt;T&gt;::Bst_Node*。当作为返回类型时,它被视为“类外”,因此无法解析Bst_Node*

    【讨论】:

    • 非常感谢@VoidStar。那行得通。但我有一些问题:我们什么时候需要使用“typename”关键字? “被视为课外”是什么意思? struct 已经在类里面定义好了,为什么不能直接作为返回类型呢?为什么只需要返回类型而不需要参数(T* A)?
    • 如果您尝试构建它,并且您收到“依赖名称不是类型”之类的错误(因编译器而异),那么您需要在此处添加typename。在你做了足够多的事情之后,它就像一种反射......只需在编译器希望你添加的任何地方添加 typename :)。但至于为什么,基本上每当您引用依赖于 T (任何模板参数)的类型以访问包含的类型时,都需要它。这使它成为一个依赖名称,需要“typename”以便它知道它是一个类型。见en.cppreference.com/w/cpp/language/dependent_name。但T 本身并不被视为从属名称。
    【解决方案2】:

    由于Binary_Search_Tree&lt;T&gt;::Bst_Node是一个依赖名,定义:

    template <class T>
    Bst_Node* Binary_Search_Tree<T>::sortedarraytobst(T* A, int start, int end)
    {/**/}
    

    应该替换为

    template <class T>
    typename Binary_Search_Tree<T>::Bst_Node*
    Binary_Search_Tree<T>::sortedarraytobst(T* A, int start, int end)
    {/**/}
    

    或(C++11 起)

    template <class T>
    auto Binary_Search_Tree<T>::sortedarraytobst(T* A, int start, int end)
    -> Bst_Node*
    {/**/}
    

    【讨论】:

    • C++14 需要返回类型为auto
    • @VoidStar:尾随返回类型是在C++11中引入的,返回类型推导是从C++14开始的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 2017-03-09
    • 1970-01-01
    相关资源
    最近更新 更多