代码之家  ›  专栏  ›  技术社区  ›  zhenguoli

sizeof…的可变模板递归。。。,但编译错误:没有匹配函数

  •  1
  • zhenguoli  · 技术社区  · 7 年前

    #include <iostream>
    using std::ostream; using std::istream;
    using std::cin; using std::cout; using std::endl;
    
    template <typename T, typename... Args>
    ostream &myprint(ostream &os, const T &t, const Args&... rest) {
        if (sizeof...(rest)) {
            os << t << ", ";
            return myprint(os, rest...);
        }
        else
            return os << t;
    }
    
    int main(int argc, char *argv[]) {
        myprint(cout, "hello");
        return 0;
    }
    

    但是当我用 g++ -std=c++1y ,它抱怨:

    error: no matching function for call to ‘myprint(std::ostream&)’
         return myprint(os, rest...);
    

    myprint ,我已经检查了 sizeof...(rest) myprint(os, rest...) . 所以我不知道为什么它会呼叫 myprint(std::ostream&) .

    基本情况 sizeof...

    对于简单的不定递归情况:

    template <typename T, typename... Args>
    ostream &myprint(ostream &os, const T &t, const Args&... rest) {
        os << t << ", ";            // print the first argument
        return print(os, rest...);  // recursive call; print the other arguments
    }
    

    对于同一个错误,上面的代码根本无法编译。

    2 回复  |  直到 7 年前
        1
  •  4
  •   songyuanyao    7 年前

    对于 if statement 声明true 声明错误 屈服于以下结果: true false

    您可以使用 constexpr if 自C++17;当 这个 声明true 将被丢弃。例如

    if constexpr (sizeof...(rest)) {
        os << t << ", ";
        return myprint(os, rest...);
    }
    else
        return os << t;
    

    template <typename T>
    ostream &myprint(ostream &os, const T &t) {
        return os << t;
    }
    
    template <typename T, typename... Args>
    ostream &myprint(ostream &os, const T &t, const Args&... rest) {
        os << t << ", ";
        return myprint(os, rest...);
    }
    

    LIVE

        2
  •  2
  •   Passer By    7 年前

    songyuanyao's answer 解释了它无效的原因,并为C++17提供了解决方案。或者,您可以有一个基本案例来 myprint 在此之前。

    template <typename T>
    ostream &myprint(ostream &os, const T &t) {
        return os << t;
    }
    
    template <typename T, typename... Args>
    ostream &myprint(ostream &os, const T &t, const Args&... rest) {
        os << t << ", ";
        return myprint(os, rest...);
    }