none
请问如何在使用可变模版参数的构造函数中使用std::ostringstream? RRS feed

  • 问题

  • 用的visual studio 2013,我想写一个异常类型,构造函数使用可变模版参数,以写入多个信息,代码如下:

    class new_exception : public std::exception
    {
    public:
    	template <typename T, typename... Args>
    	new_exception(const T& val, const Args&... args)
    	{
    		ss << val;
    		new_exception(args...);
    	}
    
    	template <typename T>
    	new_exception(const T& val)
    	{
    		ss << val;
    		exp_str = ss.str();
    	}
    
    	new_exception(const new_exception&)
    	{
    		std::cout << "new_exception(const xlog_exception&)" << std::endl;
    	}
    
    	~new_exception()
    	{
    
    	}
    
    	virtual const char* what()
    	{
    		return exp_str.c_str();
    	}
    
    private:
    	std::ostringstream ss;
    	std::string exp_str;
    };

    抛出异常的代码如下

    try
    {
    	throw new_exception("abcd:", 11, 33, 22, 1.30);
    }
    catch (new_exception& e)
    {
    	cout << e.what() << endl;
    }

    但是没有任何输出,请问为什么啊?查好几天了找不到原因,求高手指点。



    • 已编辑 bloomstar 2014年1月15日 13:39 编码错误
    2014年1月15日 13:38

全部回复

  • 求助啊………………
    2014年1月16日 5:25
  • 你好,

    你完整的代码是怎样的?你目标输出是什么样子的?根据你的部分代码,我测试如下,是可以输出内容的。

    #include "stdafx.h"
    #include <iostream>     // std::cout, std::ios
    #include <sstream>      // std::ostringstream
    class new_exception : public std::exception
    {
    public:
    	template <typename T, typename Args>
    	new_exception(const T& val, const Args& args)
    	{
    		ss << val<<args;
    	    exp_str=ss.str();
    	}
    
    	template <typename T>
    	new_exception(const T& val)
    	{
    		ss << val;
    		exp_str = ss.str();
    	}
    
    	new_exception(const new_exception&)
    	{
    		std::cout << "new_exception(const xlog_exception&)" << std::endl;
    	}
    
    	~new_exception()
    	{
    
    	}
    
    	virtual const char* what()
    	{
    		return exp_str.c_str();
    	}
    
    private:
    	std::ostringstream ss;
    	std::string exp_str;
    };
    int main () {
      
      try
    {
    	throw new_exception("abcd:", 11);
    }
    catch (new_exception& e)
    {
    	std::cout << e.what() << std::endl;
    	
    }
      getchar();
      return 0;
    }

    另外,以下关于std::ostringstream的链接供你学习参考。

    http://www.cplusplus.com/reference/sstream/ostringstream/ostringstream/


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年1月16日 9:17
  • 你好,你这么写没输出才奇怪了呢,请看清楚template <typename T, typename... Args>
    2014年1月17日 5:46
  • 你好,

    不好意思,起初我用的是VS2012来测试的template <typename T, typename... Args>程序,所以C++11的新特性没有编译通过。

    我又用VS2013测试了一次,这次编译通过了,确实没有输出,但是按照如下更改即可输出。

     template <typename T, typename... Args>
        new_exception(const T& val, const Args&... args)
        {
            ss << val;
            std::cout << ss.str();
            new_exception(args...);
            
            
        }

    需要说明的是ostringstream类通常用于格式化字符串,最终还是需要std::cout进行输出。

    http://blog.csdn.net/zijuan0810/article/details/8205976




    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.



    2014年1月17日 5:59