C++类模板参数无效

1 c++ templates stl class

我想定义一个二进制树类模板,如下所示:

template<typename Any>
class tree {
    public:
        struct treeNode {
            Any &_data;
            treeNode *_left, *_right;
            treeNode(const Any &data, treeNode *left = nullptr,
                     treeNode *right = nullptr) :
                     _data(data), _left(left), _right(right) {
            }
        };
    // ...
        std::vector<treeNode *> lookfor(
                const treeNode *, const std::function<bool(const Any &)> &) const;
};

// ? tree.h
// ? tree.cpp

template<typename Any>
std::vector<tree::treeNode *> tree<Any>::lookfor(
        const treeNode *x, const std::function<bool(const Any &)> &cmp) const {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

然后g ++不开心,告诉我这个:

tree.cpp:129:29: error: template argument 1 is invalid
 std::vector<tree::treeNode *> tree<Any>::lookfor(
                             ^
tree.cpp:129:29: error: template argument 2 is invalid
tree.cpp:129:31: error: prototype for ‘int tree<Any>::lookfor(const tree<Any>::treeNode*, const std::function<bool(const Any&)>&) const’ does not match any in class ‘tree<Any>’
 std::vector<tree::treeNode *> tree<Any>::lookfor(
                               ^
In file included from tree.cpp:1:0:
tree.h:88:33: error:                 std::vector<tree<Any>::treeNode*> tree<Any>::lookfor(const tree<Any>::treeNode*, const std::function<bool(const Any&)>&) const
         std::vector<treeNode *> lookfor(
                                 ^
Run Code Online (Sandbox Code Playgroud)

所以我想知道为什么会发生这种情况以及如何解决这个问题.

我不擅长英语,这是我第一次在statckoverflow上提问,所以如果我犯了任何错误请告诉我:)

Mat*_*sFG 5

代码:

std::vector<tree::treeNode *> tree<Any>::lookfor
Run Code Online (Sandbox Code Playgroud)

引用树,它是一个模板,没有模板参数.它应该是这样的:

std::vector<typename tree<Any>::treeNode *> tree<Any>::lookfor
Run Code Online (Sandbox Code Playgroud)

此外,由于这些是模板,因此您不应该有树的.cpp文件,这也会导致问题.

  • `std :: vector <typename tree <Any> :: treeNode*> tree <Any> :: lookfor` (2认同)
  • @MatiasFG,依赖名称仍然需要`typename`,你引用的链接不会改变它.`tree <Any>`显然是依赖的,因为`Any`是一个模板参数. (2认同)