2

この質問からの一番の答えを自分のプロジェクトに入れようとしていますが、gcc でコンパイルするのに問題があります (RHEL Linux で "-std=gnu++0x" を使用)。私はすでに元のコードにいくつかの変更を加えているため、最終的には次のようになります。

#include <string>
#include <vector>
#include <fstream>
#include <cerrno>
#include <cstring>
#include <array>
#include <algorithm>

template <typename T0, typename T1, size_t N>   bool operator *(const T0& lhs, const std::array<T1, N>& rhs)
{
    return std::find(rhs.begin(), rhs.end(), lhs) != rhs.end();
}
template <class T0, class...T>  std::array<T0, 1+sizeof...(T)> in(T0 arg0, T...args)
{
    return {{arg0, args...}};
}

これらのインクルードの一部は関係ありません。すべてを表示しているだけです。私は次のような関数を使用しています:

if (1 *in(1,2,3))

コンパイル時に、gcc は「in」の「r​​eturn」行で次のエラーを返します。

 error: could not convert '{{arg0, args#0, args#1}}' to 'std::array<int, 3u>'

なぜこれが喜ばれるのか、誰かが光を当てることができますか?

私はこれまで C++11 であまり作業をしたことがないので、何が問題なのかを突き止めるのに少し戸惑っています。「args」ビットの周りにさまざまな数の {} を試してみましたが、今のところ役に立ちません。

ご協力いただきありがとうございます。

4

1 に答える 1

3

問題は、C++11 を完全にサポートしていない古いバージョンの GCC を使用していることです。GCC 4.8.x に更新すると、コードは正常にコンパイルされます。

以下のコードのライブ バージョンは、ideoneで見つけることができます。

#include <array>
#include <algorithm>

template <typename T0, typename T1, size_t N>
bool operator *(const T0& lhs, const std::array<T1, N>& rhs)
{
    return std::find(rhs.begin(), rhs.end(), lhs) != rhs.end();
}
template <class T0, class...T>
std::array<T0, 1 + sizeof...(T)> in(T0 arg0, T...args)
{
    return { {arg0, args...} };
}

int main()
{
    if (1 * in(1, 2, 3)) {}
}
于 2013-08-03T23:34:59.330 に答える