以及如何修复代码?
这是代码:https : //godbolt.org/z/vcP6WKvG5
#include <memory>
#include <utility>
enum class Format {
Number,
Text,
};
template <template <Format> typename Visitor, typename... Args>
void switchByFormat(Format format, Args&&... args) {
switch(format) {
case Format::Number:
Visitor<Format::Number>::visit(std::forward<Args>(args)...);
break;
case Format::Text:
Visitor<Format::Text>::visit(std::forward<Args>(args)...);
break;
}
}
struct AstNode {};
template <Format format>
struct ANode: public AstNode {};
using AstNodePtr = std::shared_ptr<AstNode>;
template <template <Format> typename AstNodeT,
typename... Args>
struct AstNodeFactory {
template <Format format>
struct Visitor {
static void visit(AstNodePtr& result, Args&&... args)
{
result = std::make_shared<AstNodeT<format>>(std::forward<Args>(args)...);
}
};
};
template <template <Format> typename AstNodeT,
typename... Args>
AstNodePtr makeAstNode(Format format, Args&&... args)
{
AstNodePtr result;
switchByFormat<typename AstNodeFactory<AstNodeT, Args...>::Visitor>(format,
result,
std::forward<Args>(args)...);
return result;
}
int main() {
auto textAnode = makeAstNode<ANode>(Format::Text);
}
Clang 链接:https : //godbolt.org/z/9fxWE9j71
Clang中的错误是:
source>:45:64: error: typename specifier refers to class template member in 'AstNodeFactory<ANode>'; argument deduction not allowed here
switchByFormat<typename AstNodeFactory<AstNodeT, Args...>::Visitor>(format,
GCC 链接:https : //godbolt.org/z/4EvrzGWYE
海合会错误:
In instantiation of 'AstNodePtr makeAstNode(Format, Args&& ...) [with AstNodeT = ANode; Args = {}; AstNodePtr = std::shared_ptr<AstNode>]':
<source>:52:53: required from here
<source>:45:5: error: 'typename AstNodeFactory<ANode>::Visitor' names 'template<enum class Format format> struct AstNodeFactory<ANode>::Visitor', which is not a type
45 | switchByFormat<typename AstNodeFactory<AstNodeT, Args...>::Visitor>(format,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
uj5u.com热心网友回复:
由于Visitor
是模板类而不是型别,所以需要指定template
关键字
switchByFormat<AstNodeFactory<AstNodeT, Args...>::template Visitor>(
//^^^^^^^^
format, result, std::forward<Args>(args)...);
演示。
0 评论