1

次のコードを試しました。

template <int VAL>
void printVAL()
{
    for(int i=0;i<VAL; i++){
        cout << " i value is "<<i<<endl;
    }
}

インスタンス化: printVAL<100>()

( std::string s ) を非型テンプレート パラメーターとして使用すると、コンパイラーは次のエラーで叫びました。

"class std::basic_str<char>' is not a valid type for a template non-type parameter.

私が知っているのは、定数の整数値のみを使用する必要があるということです。2倍にもなりません。

質問:

1) std::string を使用すべきではない理由、何が気になるのですか?

2)「外部リンケージを持つオブジェクトへのポインタを使用できる」とはどういう意味ですか? サンプルコードを入手できますか?

4

4 に答える 4

0

14.1/4によると、

非タイプのテンプレート パラメータは、次の (オプションで cv 修飾された) タイプのいずれかを持つ必要があります。

  • 整数型または列挙型、
  • オブジェクトへのポインタまたは関数へのポインタ、
  • オブジェクトへの左辺値参照または関数への左辺値参照、
  • メンバーへのポインター、
  • std::nullptr_t.

あなたstd::stringはそれらのどれでもありません。

于 2013-04-25T12:25:23.593 に答える
0

非型テンプレート パラメータとして整数値のみを渡すことができます。それは言語の制限です。おそらく次のようなものが必要です。

template<class T>
void printVAL(const T& t)
{
    for (auto& x : t) {
        cout << " x value is "<< x << '\n';
    }
}

これは、コンテナ、文字列、配列など、何でも出力します。

于 2013-04-25T12:18:19.730 に答える
0

1) std::string を使用すべきではない理由、何が気になるのですか?

コンパイラは、コンパイル時にテンプレート パラメータを推測して置換できる必要があります。これはstd::stringオブジェクトでは実行できません。実行時に変更される可能性があります (通常は変更されます)。

この Q&Aも参照してください。

2)「外部リンケージを持つオブジェクトへのポインタを使用できる」とはどういう意味ですか? サンプルコードを入手できますか?

これは、静的ストレージ期間を持つオブジェクト (宣言されexternているオブジェクト) のアドレスが定数式であるためです。

n3337 5.19/3、地雷強調:

リテラル定数式は、リテラル型の prvalue コア定数式ですが、ポインター型ではありません。整数定数式は、整数型またはスコープなし列挙型のリテラル定数式です。[注: このような式は、配列境界 (8.3.4、5.3.4)、ビットフィールド長 (9.6)、基になる型が固定されていない場合の列挙子初期化子 (7.2)、null ポインター定数として使用できます。 (4.10)、およびアラインメントとして (7.6.2)。—終わりの注 ] 型 T の変換された定数式は、リテラル定数式であり、暗黙的に型 T に変換されます。ここで、暗黙的な変換 (存在する場合) はリテラル定数式で許可され、暗黙的な変換シーケンスにはユーザー定義の変換のみが含まれます。左辺値から右辺値への変換 (4.1)、整数昇格 (4.5)、および整数変換 (4. 7) 変換の縮小 (8.5.4) 以外。[注: このような式は、ケース式 (6.4.2)、基礎となる型が固定されている場合は列挙子初期化子 (7.2)、整数型または列挙型の非型テンプレート引数 (14.3) として使用できます。—終了注 ] 参照定数式は、静的ストレージ期間または関数を持つオブジェクトを指定する左辺値コア定数式です。アドレス定数式は、静的ストレージ期間を持つオブジェクトのアドレス、関数のアドレス、NULL ポインター値、または型 std の prvalue コア定数式に評価されるポインター型の prvalue コア定数式です。 :nullptr_t. リテラル定数式、参照定数式、アドレス定数式をまとめて定数式と呼びます。

あなたが求める例:

#include <iostream>
#include <string>

extern std::string str; // not really neccesary

std::string str;

template<std::string* ptr>
struct S {
    S() { std::cout << ptr->length() << '\n'; }
    ~S() { std::cout << *ptr; }
};

int main()
{
    S<&str> s;
    str = "Hello world!";
}
于 2013-04-25T12:39:15.177 に答える