用模板参数除以零

gsf*_*gsf 6 c++ templates

我有一个模板

template<size_t N>
class Foo {
    int bar(int a) {
        if (N == 0)
            return 0;
        return a / N;
    }
 }
Run Code Online (Sandbox Code Playgroud)

当我用0实例化它

Foo<0> bar;
Run Code Online (Sandbox Code Playgroud)

gcc太聪明了,在编译时报告除零

我试过了

class Foo<size_t N> {
    template<size_t M>
    int bar(int a) {
        return a / N;
    }

    template<>
    int bar<0>(int a) {
        return 0;
    }
 };
Run Code Online (Sandbox Code Playgroud)

但这给了我错误:

错误:非命名空间范围'class Foo'中的显式特化错误:主模板声明中的template-id'bar <0>'

我有什么想法可以解决/解决这个问题?

Ecl*_*pse 5

您可以随时重新考虑公式:

template<size_t N>
class Foo {
    bool bar() {
        return N == 0 || (N >=5 && N < 10);
    }
 }
Run Code Online (Sandbox Code Playgroud)


jxh*_*jxh 4

您可以为Foo<0>.

template <>
class Foo<0> {
public:
    bool bar () { return true; }
};
Run Code Online (Sandbox Code Playgroud)

如果您只想单独解决该问题bar,而不触及 的任何其他部分Foo,则可以创建一个伴随方法来避免该问题:

template <size_t N>
class Foo
{
    bool bar(int n) {
        if (n == 0) return true;
        return 5 / n == 1;
    }
public:
    bool bar() { return bar(N); }
};
Run Code Online (Sandbox Code Playgroud)

或者将该方法的实现提取到它自己的类中,并专门化:

template <size_t N>
class Bar
{
public:
    bool operator() const { return 5 / N == 1; }
};

template <>
class Bar<0>
{
public:
    bool operator() const { return true; }
};

template <size_t N>
class Foo {
    bool bar() { return Bar<N>()(); }
};
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用 Jarod42 的建议,并专门化方法本身(为了完整性,此处重申了答案)。

template <size_t N>
class Foo
{
public:
    bool bar() { return 5 / N == 1; }
};

template <> inline bool Foo<0>::bar() { return true; }
Run Code Online (Sandbox Code Playgroud)