11

検討:

#include <iostream>

template <typename T> T getArray( T &arr ) {
    return *arr;
}

int main() {

    int a[] = {5, 3, 6};

    std::cout << getArray(a);

}

配列の最初の要素を出力すると思われますが、機能していません。何故ですか?

エラーが表示されます:

error: no matching function for call to 'getArray(int [3])'
4

4 に答える 4

12

の型はaですint[3]ので、 の型はTですint[3]関数から配列を返すことはできません。

C++11 では、これを行うことができます。

template <typename T>
auto getArray(T &arr) -> decltype(*arr)
{ 
    return *arr; 
} 

またはこれ:

// requires <type_traits>

template <typename T>
typename std::remove_extent<T>::type& getArray(T &arr)
{ 
    return *arr; 
} 

C++03 ではこれを行うことができますが、まったく同じではありません。

template <typename T>
T getArray(T* arr /* not really an array */)
{ 
    return *arr; 
} 

または:

template <typename T, std::size_t N>
T getArray(T (&arr)[N])
{ 
    return *arr; 
} 
于 2012-08-13T22:12:08.697 に答える
2

試す

template <typename T, size_t N>
T getArray( T (&arr)[N] ) {
    return *arr;
}

これTは配列ではなく要素の型です。

于 2012-08-13T22:12:18.793 に答える
1

MSVC++ 2010 Express でもコンパイルできません。予想どおり、これは参照をパラメーターとして使用し、スカラーを戻り値として使用し、ポインターが関数呼び出しに渡されるためです。テンプレートに関する正確なルール (つまり、型がどのように決定されるか) はわかりませんが、そのコードはコンパイラを混乱させる必要があります。次のコードは、期待どおりの結果を返します。

#include <iostream>

template <typename T> T getArray( T* arr ) {
    return *arr;
}

int main() {

    int a[] = {5, 3, 6};

    std::cout << getArray(a);

}
于 2012-08-13T22:12:20.590 に答える
1

試していただけますか:

#include <iostream>

template <typename T> T getArray( T arr[] ) {
    return *arr;
}

int main() {

    int a[] = {5, 3, 6};

    std::cout << getArray(a);

}
于 2012-08-13T22:14:26.953 に答える