2

私はこのコード例を持っています:

#include <iostream>
#include <memory>

template <typename T>
void func1(T& value)
{
    std::cout << "passed 1 ..." << std::endl;
}

template <template <typename> class T, typename U>
void func2(T<U>& value)
{
    std::cout << "passed 2 ..." << std::endl;
}

int main()
{
    std::auto_ptr<int> a;
    const std::auto_ptr<int> ca;

    // case 1: using func1
    func1(a);  // OK
    func1(ca); // OK

    // case 2: using func2
    func2(a);  // OK
    func2(ca); // Compilation error

    return 0;
}

最初のケースでは、関数 'func1' は修飾子に関係なくジェネリック引数を受け入れますが、2 番目のケースでは、引数に const 修飾子がある場合、関数 'func2' は失敗します。なぜこれが起こるのですか?

これはコンパイルエラーです:

make all 
Building file: ../src/Test2.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/Test2.d" -MT"src/Test2.d" -o "src/Test2.o" "../src/Test2.cpp"
../src/Test2.cpp: In function ‘int main()’:
../src/Test2.cpp:27: error: invalid initialization of reference of type ‘std::auto_ptr<int>&’ from expression of type ‘const std::auto_ptr<int>’
../src/Test2.cpp:11: error: in passing argument 1 of ‘void func2(T<U>&) [with T = std::auto_ptr, U = int]’
make: *** [src/Test2.o] Error 1
4

1 に答える 1

1

問題は、 の場合func1、コンパイラが推測する必要がTあり、取得することです。

  • Tstd::auto_ptr<int>最初の通話中です
  • Tconst std::auto_ptr<int>2 番目の通話中です

どちらの場合でもT、それ自体は有効です。

の場合、コンパイラはとfunc2を推測する必要があります。ここで、はテンプレート テンプレート パラメータです。必要なものは次のとおりです。TUT

  • Tですstd::auto_ptrUint最初の呼び出しにあります
  • Tですconst std::auto_ptrUint2 番目の呼び出しにあります

そしてあなたの問題があります:それは型プロパティを有効な型ではないテンプレートと組み合わせたので、それ自体にするTことはできません。const std::auto_ptrconststd::auto_ptr

于 2013-09-27T15:27:23.460 に答える