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+;中的模板参数重写虚拟函数+;?_C++_Templates_Virtual Functions - Fatal编程技术网

C++ 如何使用C+;中的模板参数重写虚拟函数+;?

C++ 如何使用C+;中的模板参数重写虚拟函数+;?,c++,templates,virtual-functions,C++,Templates,Virtual Functions,如何使用模板参数重写虚拟函数? virtualt接受(访问者) #包括 模板 班级访客{ 公众: 模板 T访问(K); }; 模板 类表达式{ 公众: 虚拟不接受(访客); }; 模板 类:公共表达式{ 公众: int值; 照明(INTA){ 值=a; } 不接受(访客v)覆盖{ v、 访问(*本); } }; 模板 类添加:公共表达式{ 公众: Expr左,右; 添加(出口a、出口b){ 左=a;右=b; } 不接受(访客v)覆盖{ v、 访问(*本); } }; 类别电视:公众访客{ 公众:

如何使用模板参数重写虚拟函数?
virtualt接受(访问者)

#包括
模板
班级访客{
公众:
模板
T访问(K);
};
模板
类表达式{
公众:
虚拟不接受(访客);
};
模板
类:公共表达式{
公众:
int值;
照明(INTA){
值=a;
}
不接受(访客v)覆盖{
v、 访问(*本);
}
};
模板
类添加:公共表达式{
公众:
Expr左,右;
添加(出口a、出口b){
左=a;右=b;
}
不接受(访客v)覆盖{
v、 访问(*本);
}
};
类别电视:公众访客{
公众:
国际访问(Lit a){
返回a.value;
}
int访问(添加a){
返回a.left.accept(*this)+a.right.accept(*this);
}
};
int main(){
增加一个(照明(1)、照明(2));
电视观众;

在我这方面,失败的原因如下:

/tmp/ccysNlSn.o: In function `Add<int>::accept(Visitor<int>)':
main.cpp:(.text._ZN3AddIiE6acceptE7VisitorIiE[_ZN3AddIiE6acceptE7VisitorIiE]+0x2b): undefined reference to `int Visitor<int>::visit<Add<int> >(Add<int>)'
/tmp/ccysNlSn.o:(.rodata._ZTV4ExprIiE[_ZTV4ExprIiE]+0x10): undefined reference to `Expr<int>::accept(Visitor<int>)'
/tmp/ccysNlSn.o: In function `Lit<int>::accept(Visitor<int>)':
main.cpp:(.text._ZN3LitIiE6acceptE7VisitorIiE[_ZN3LitIiE6acceptE7VisitorIiE]+0x2b): undefined reference to `int Visitor<int>::visit<Lit<int> >(Lit<int>)'
collect2: error: ld returned 1 exit status
undefined reference to `int Visitor<int>::visit<Add<int> >(Add<int>)'
undefined reference to `Expr<int>::accept(Visitor<int>)'
/tmp/ccysNlSn.o:在函数“Add::accept(Visitor)”中:
main.cpp:(.text._zn3addie6accepte7visitorie[_zn3addie6accepte7visitorie]+0x2b):未定义对“int Visitor::visit(Add)”的引用
/tmp/ccysNlSn.o:(.rodata.ZTV4ExprIiE[ZTV4ExprIiE]+0x10):对“Expr::accept(Visitor)”的未定义引用
/tmp/ccysNlSn.o:在函数“Lit::accept(Visitor)”中:
main.cpp:(.text.\u zn3litie6accepte7visitorie[\u zn3litie6accepte7visitorie]+0x2b):未定义对“int Visitor::visit(Lit)”的引用
collect2:错误:ld返回了1个退出状态
这里的主要错误如下:

/tmp/ccysNlSn.o: In function `Add<int>::accept(Visitor<int>)':
main.cpp:(.text._ZN3AddIiE6acceptE7VisitorIiE[_ZN3AddIiE6acceptE7VisitorIiE]+0x2b): undefined reference to `int Visitor<int>::visit<Add<int> >(Add<int>)'
/tmp/ccysNlSn.o:(.rodata._ZTV4ExprIiE[_ZTV4ExprIiE]+0x10): undefined reference to `Expr<int>::accept(Visitor<int>)'
/tmp/ccysNlSn.o: In function `Lit<int>::accept(Visitor<int>)':
main.cpp:(.text._ZN3LitIiE6acceptE7VisitorIiE[_ZN3LitIiE6acceptE7VisitorIiE]+0x2b): undefined reference to `int Visitor<int>::visit<Lit<int> >(Lit<int>)'
collect2: error: ld returned 1 exit status
undefined reference to `int Visitor<int>::visit<Add<int> >(Add<int>)'
undefined reference to `Expr<int>::accept(Visitor<int>)'
对“int Visitor::visit(Add)”的未定义引用
对“Expr::accept(Visitor)”的未定义引用
这些错误意味着您尚未提供
int Visitor::visit(Add)
Expr::accept(Visitor)
的实现。因此,只需提供一个空的实现即可解决这些问题:

template<typename T>
class Visitor{
public:
    template<typename K>
    T visit(K) {};  // Added an empty body here
};

template<typename T>
class Expr{
public:
    virtual T accept(Visitor<T>) {};  // Added an empty body here
};
模板
班级访客{
公众:
模板
T visit(K){};//在这里添加了一个空实体
};
模板
类表达式{
公众:
virtual T accept(Visitor){};//在此处添加了一个空主体
};

这将很好地编译和链接,但您当然需要为实现提供实际的代码。

您所显示的代码有什么问题?请您的问题告诉我们。另外,请花一些时间阅读,以及。不确定您为什么要调用
虚拟T accept(访问者)这部分工作正常,因为
T
在这一点上是固定的。真正的问题是访问者的
模板T visit(K);
:你说访问者知道如何访问任何东西,但你没有演示如何访问。