2

関数 foo の 2 つのバージョンを持つ次のコードがあります。AConst バージョンが呼び出されるように const が渡される場合は、AVar 型を取る foo に変数が渡されて呼び出されるようにしたいと思います。

#include <iostream>

template <typename T>
struct AConst
{
   AConst(T x):t(x){}
   const T t;
};

template <typename T>
struct AVar
{
   AVar(const T& x):t(x){}
   const T& t;
};

template <typename T>
void foo(AConst<T> a) { std::cout << "foo AConst\n"; }

template <typename T>
void foo(AVar<T>   a) { std::cout << "foo AVar\n";   }

int main()
{
   int i = 2;

   foo(1);
   foo(i);

   return 0;
}

現在、コンパイラはあいまいなエラーを出しています。解決方法がわかりません。

更新:わずかに変更を加えたLeonidの回答に基づいて、必要に応じて機能する次のソリューションを次に示します。

template <typename T>
void foo_x(AConst<T> a) { std::cout << "foo AConst\n"; }

template <typename T>
void foo_x(AVar<T>   a) { std::cout << "foo AVar\n";   }


template <typename T>
void foo(const T& a) { foo_x(AConst<T>(a));}

template <typename T>
void foo(T& a) { foo_x(AVar<T>(a));}
4

4 に答える 4

0

次のように、完全なクラステンプレートを関数に渡すことができます

#include <iostream>

template <typename T>
struct AConst
{
    AConst(T x) :t(x){ std::cout << "AConst\n"; }
    const T t;
};

template <typename T>
struct AVar
{
    AVar(const T& x) :t(x){ std::cout << "AVar\n"; }
    const T& t;
};

template <typename T1>
void foo(T1 a){}

int main()
{
    int i = 2;

    foo<AConst<int>>(1);
    foo<AVar<int>>(i);

    return 0;
}
于 2013-11-22T07:48:14.220 に答える
0

コンパイラは適切な関数を選択できません。異なる名前で 2 つの関数を宣言することができます。

template <typename T>
void fooConst(AConst<T> a) { std::cout << "foo AConst\n"; }

template <typename T>
void fooVar(AVar<T>   a) { std::cout << "foo AVar\n";   }

または、次の方法で関数を使用することもできます。

int main()
{
   int i = 2;

   foo(AConst<int>(1));
   foo(AVar<int>(i));

   return 0;
}

一般に、コンパイラに十分な情報を提供しません。メイン関数でどのインスタンスを使用する必要があるかを知っているのはあなただけです。おそらく、このコードの目的をより詳細に説明すると、解決策はより具体的になります。

于 2013-11-22T07:43:06.760 に答える
0

キャストを使用してあいまいなエラーを排除します。この場合、私の記憶が正しければ、「1」を AConst としてキャストできます。テンプレート型にキャストするための正確な構文を覚えていません...おそらく次のようなものです:

foo( (AConst<int>) 1); .. or something to that effect.
于 2013-11-22T07:42:22.470 に答える