2

コンパイラが次のコードでテンプレート引数を推測できないのはなぜですか? コードを修正するにはどうすればよいですか? 実行時のオーバーヘッドをできるだけ低くしたい。

#include <iostream>

using namespace std;

struct Test
{
    template<int N>
    Test(const char data[N]) :
        data(data),
        size(N)
    {}

    const char *data;
    int size;
};

int main()
{
    Test test("Foobar");
    return 0;
}

スニペットをできるだけ小さくして読みやすいようにしました。

pos-reply 更新:

Tales of C++ K-balloからのこの説明は役に立つかもしれません:

左辺値変換。右辺値が予期されるコンテキストで左辺値引数が使用される場合に適用されます。これらの変換は、左辺値から右辺値への変換配列からポインターへの変換、および関数からポインターへの変換です。これは、値渡し時にすべての関数引数に適用される型変換であり、通常は引数の減衰と呼ばれます。

4

1 に答える 1

9

参照によって引数を受け入れる必要があります。

Test(const char (&data)[N] ) 

N推測されます。

あなたの場合、引数は値によって受け入れられます。これにより、配列はコンストラクターに渡されるときに配列の最初の要素へのポインターに減衰します。

于 2013-03-09T18:24:40.183 に答える