0

您能帮我修复以下代码中的编译错误吗:

#include <sstream>
#include <iostream>

using namespace std;

template<typename T, typename ...P>
class Mystrcat{
 public:
 Mystrcat(T t, P... p){init(t,p...);}

 ostringstream & get(){return o;}         

 private:
 ostringstream o;
 void init(){}
 void init(T t, P... p);
};

template<typename T, typename ...P>
void Mystrcat<T,P...>::init(T t, P ...p){
  o << t;
  if (sizeof...(p)) init(p...);
}

int main(){
 Mystrcat<char*,char *> m("Amma","Namasivayah");
 cout << m.get().str();
}

我得到错误,没有匹配的函数调用

‘Mystrcat<char*, char*>::init(char*&)’

注:候选人是:

void Mystrcat<T, P>::init() [with T = char*, P = char*]
void Mystrcat<T, P>::init(T, P ...) [with T = char*, P = char*]

gcc 版本 4.4.3 (Ubuntu 4.4.3-4ubuntu5)

谢谢肯定

4

1 回答 1

0

您收到此错误是因为没有办法将您解压缩p到任何一个init函数中。在您的实例化Mystrcat<char*, char *>中,解包 aP...将在 type: 中产生一个单一的东西char*,它没有init带有该签名的 a (实例化版本将有一个void init()and void init(char*, char*),而您正在尝试调用init(char*))。

事实上,你的模板是不可能实例化的,因为init它总是比你给它的参数多一个void Mystrcat<T,P...>::init(T t, P ...p)。如果您更改定义以调用您定义的内容:

template<typename T, typename ...P>
void Mystrcat<T,P...>::init(T t, P ...p){
  o << t;
  if (sizeof...(p)) init(t, p...);
}

那么这将起作用(至少在 g++-4.5.2 中)。


编辑:我认为这就是你真正想要的:

#include <sstream>
#include <iostream>

class MyCollector
{
public:
    template <typename... T>
    explicit MyCollector(const T&... args)
    {
        init(args...);
    }

    std::string str()
    {
        return _stream.str();
    }

private:
    void init()
    { }

    template <typename First, typename... Rest>
    void init(const First& first, const Rest&... rest)
    {
        _stream << first;
        init(rest...);
    }

    std::ostringstream _stream;
};

int main()
{
    MyCollector collector("Whatever ", "stuff like ", 2, " or ", 3.14, "\n");
    std::cout << collector.str();
    return 0;
}
于 2011-08-19T01:40:00.580 回答