注册 登录
编程论坛 C++教室

C++的hpp文件 template代码部分 编译出错C2061 C2143

竹下旦时 发布于 2018-07-19 17:37, 1533 次点击
以红色出为样例  其余template同样有该问题    编译不通过
 template<typename T    , typename... Ts>
        static void Print(std::stringstream &os, const T &first) {
            os << first;
        }

    template<typename T    , typename... Ts> //错误    6    error C2143: 语法错误 : 缺少“,”(在“...”的前面)
        static std::string Print(std::stringstream &os, const T &first, Ts... args) {//错误    7    error C2061: 语法错误: 标识符“Ts”   
            os << first;
            Print(os, args...);
            return os.str();
        }

    template<typename T    , typename... Ts>
        static std::string Print(T first, Ts... args) {
            std::stringstream ss;
            return Print(ss, first, args...);
        }
1 回复
#2
rjsp2018-07-20 10:35
首先,也是最重要的,你的代码要完整,要排版

其次,如果确定自己的代码没错的话,要讲出你用的编译器编译参数
比如,如下代码在 gcc8.1 编译上,编译参数在 -std=c++11 及之上,可以编译通过
程序代码:
#include <iostream>
#include <sstream>
#include <string>

template<typename T, typename... Ts>
static void Print( std::ostringstream& os, const T& first )
{
    os << first;
}

template<typename T, typename... Ts>
static std::string Print( std::ostringstream& os, const T& first, Ts... args )
{
    os << first;
    Print( os, args... );
    return os.str();
}

template<typename T, typename... Ts>
static std::string Print( T first, Ts... args )
{
    std::ostringstream ss;
    return Print( ss, first, args... );
}


using namespace std;

int main( void )
{
    cout << Print(1,"-",2.3) << endl;
}

顺便说一下,C++17引入的 fold expression 可以简化很多代码。如下代码在 gcc8.1 编译上,编译参数在 -std=c++17 及之上(注意上一段代码只需要C++11标准,这一段代码需要C++17标准),可以编译通过
程序代码:
#include <iostream>
#include <sstream>
#include <string>

template<typename ...Args>
static std::string Print( Args&&... args )
{
    std::ostringstream ss;
    ( ss << ... << args );
    return ss.str();
}

using namespace std;

int main( void )
{
    cout << Print(1,"-",2.3) << endl;
}


1