Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法从模板成员函数调用模板成员函数_C++_Templates_Methods - Fatal编程技术网

C++ 无法从模板成员函数调用模板成员函数

C++ 无法从模板成员函数调用模板成员函数,c++,templates,methods,C++,Templates,Methods,我成功地实现了集模板作为AVL平衡二叉搜索树。现在,我正试图使代码更短,更具可读性。当将左修复不平衡和右修复不平衡合并到以左修复或右修复为模板的修复不平衡时,我遇到了问题。我一步一步地重新开始,现在我正在修复不平衡(左或右,节点),并得到以下错误: adts/implementations/set.cpp:224:3: error: no matching function for call to ‘Set<int>::rotate(Set<int>::nodeT*&am

我成功地实现了集模板作为AVL平衡二叉搜索树。现在,我正试图使代码更短,更具可读性。当将左修复不平衡和右修复不平衡合并到以左修复或右修复为模板的修复不平衡时,我遇到了问题。我一步一步地重新开始,现在我正在修复不平衡(左或右,节点),并得到以下错误:

adts/implementations/set.cpp:224:3: error: no matching function for call to ‘Set<int>::rotate(Set<int>::nodeT*&)’
adts/implementations/set.cpp:224:3: note: candidate is:
adts/implementations/set.cpp:70:39: note: template<Set<int>::directionT DIRECTION> void Set::rotate(Set<ElemT>::nodeT*&) [with Set<ElemT>::directionT DIRECTION = L, ElemT = int]
adts/implementations/set.cpp:224:3:错误:调用“set::rotate(set::nodeT*&)”时没有匹配的函数
adts/implements/set.cpp:224:3:注:候选项为:
adts/implementations/set.cpp:70:39:注意:模板void set::rotate(set::nodeT*&)[with set::directionT DIRECTION=L,ElemT=int]
请注意,旋转(节点)模板已实现并合并(左+右合并到模板中),并且在使用单独的修复之前已成功。 我已经尝试过:'this->'并在单独的's中指定functionName之后的两个模板参数,但这些都没有帮助

你能指出我做错了什么吗

更多代码:

enum directionT { LEFT=0, RIGHT=1 }; // inside class definition

template <directionT DIRECTION> void rotate(nodeT * & t); // line 70, inside class def

template <typename ElemT>
bool Set<ElemT>::fix_imbalance(directionT direction, nodeT * & node)
{
    directionT R = (direction==LEFT) ? RIGHT : LEFT;
    ...
    rotate<R>(node); // line 224
    ...
}

// this below worked before,
// when fix_imbalance_left and fix_imbalance_right were separate
// there I called rotate<LEFT>(node); and rotate<RIGHT>(node); and it worked
template <typename ElemT>
template <typename Set<ElemT>::directionT L>
void Set<ElemT>::rotate(nodeT * & t)
{ ... }
enum方向t{LEFT=0,RIGHT=1};//类内定义
模板空心旋转(节点*&t);//第70行,def级内部
模板
布尔集合::修复不平衡(方向T方向、节点集*&节点)
{
方向T R=(方向==左)?右:左;
...
旋转(节点);//第224行
...
}
//下面这个以前用过,,
//当左固定和右固定不平衡分开时
//在那里我称之为旋转(节点);旋转(节点);它成功了
模板
模板
空集::旋转(节点集*&t)
{ ... }

很抱歉,我之前没有发布此消息。

我认为您正在尝试从变量实例化模板。请尝试:

template <typename ElemT>
bool Set<ElemT>::fix_imbalance(directionT direction, nodeT * & node)
{
    directionT R = (direction==LEFT) ? RIGHT : LEFT;
    ...
    if (R==LEFT)
         rotate<LEFT>(node); // line 224
    else
         rotate<RIGHT>(node);
    ...
}
模板
布尔集合::修复不平衡(方向T方向、节点集*&节点)
{
方向T R=(方向==左)?右:左;
...
如果(R==左)
旋转(节点);//第224行
其他的
旋转(节点);
...
}

我认为我们需要查看导致错误的代码,第70行和第224行以及一些上下文。您可能缺少
类型名
@Charles或
模板
,因为他是从模板调用模板,所以编译器没有足够的“智能”来做显而易见的事情?我试图使用模板来消除几乎重复的函数,并使代码更短,等等。但显然,模板并不打算用于此,因为代码在许多方面变得更长、更复杂,所以我宁愿使用重复的版本。“(R==左)?旋转(节点):旋转(节点)”与您的建议等效?顺便说一句,谢谢。那么变量永远不会在编译时计算?即使只有两种情况,这是显而易见的?如果您希望它也按您建议的方式工作,您必须将
directionT
作为参数传递给rotate函数。您可以在编译时对变量求值,但必须使用非常具体的技术。请参见:@user1358编译器必须为
fix\u失衡
创建一个函数体,并向其提供两个输入-
方向
节点
。若你们总是在编译时知道方向,你们可以把它变成一个模板参数,用来
fik
@Fiktik:这就是我最初做的,也是我第一次遇到错误消息的地方。函数参数版本只是查找错误源的一步。现在我不知道如何让它在没有错误消息的情况下工作,因为“从变量实例化模板”,也不知道它像模板编程一样丑陋/冗长/不可读。我想你不能在C++中同时做所有这些事情。你能?