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)

ありがとうsuresh

4

1 に答える 1

0

pどちらの関数にも解凍する方法がないため、このエラーが発生しinitます。インスタンス化では、aをMystrcat<char*, char *>解凍するP...と、次のタイプの単一のものが生成されます。これには、その署名char*がありません(インスタンス化されたバージョンには、とがありますが、呼び出しようとしています)。initvoid init()void init(char*, char*)init(char*)

実際、テンプレートをインスタンス化することは不可能です。initこれは、で指定するよりも常に1つ多くの引数を取るためです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 に答える