为什么C ++找不到bool运算符?运营商的范围?

时间:2018-05-17 16:30:58

标签: c++ c++11 templates

使用解析器组合库,此示例源自此,但显然已更改某些名称以保护无辜者:

> g++ -std=c++11 test.cc -o test

test.cc: In instantiation of ‘bool operator!(T) [with T = another_type]’:
test.cc:24:10:   required from here
test.cc:17:20: error: ‘only_string<another_type> a’ has incomplete type
     only_string<T> a;
                    ^

我有一个模板操作员!应该只在T是字符串时替换,而另一种类型在其上有bool操作符。如果我试着打电话给a,它首先找到操作员,无法替换并放弃。任何人都可以解释这种行为以及如何纠正它吗?

这是g ++ 5.4.0的输出

{{1}}

1 个答案:

答案 0 :(得分:5)

是编译器“放弃了”因为它认为了!运营商是最佳匹配。如果您真的希望编译器忽略该重载,则需要使用一种名为SFINAE的技术。

template <typename T,
        std::enable_if_t<std::is_same_v<T, std::string>>* = nullptr>
bool operator !(T) {
    return true;
}

这样,如果编译器尝试选择此函数,它将无法将参数替换为签名并将忽略它。这不会发生在函数体中,这就是你的版本失败的原因。