エラー、バグ、質問 - ページ 2006

 
fxsaber:

なぜ両方がコンパイルされるべきなのか?

一般的に、私はテンプレートをほとんど使いません - 詳細を説明しませんでした - 直感的なレベルでしか説明できません。

2番目のケースでは、TをA*で直接置き換えることでうまくコンパイルできます。

class A {};
void f( A * const ) {}
void OnStart()
{
        A *a;
        f( a ); //нормально
}

1番目のケースでは、直接の置換はうまくいきませんが、冗長なパラメータT2を追加することができます - 添加すると正常にコンパイルされます - 添加しなくても正常です - それが冗長である理由です。

template<typename T, typename T2>
void f( T, const T2 ) {}
class A {};
void OnStart()
{
        const A *a;
        f( a, a ); //нормально
}
 
A100:

直感的には,constは型の一部であることもあれば,単なる識別子であることもあり,関数内部ではポインタはconstになる.

これはPrint(__FUNCSIG__)で実感できる。

 
最適化テーブルのドローダウンの値が変に表示される。最大ドローダウンを手段別に表示します(ただし、パーセンテージで表記します)。しかし、一回テストしてみると、相対的なドローダウンが最大値と異なる(割合が大きくなったり小さくなったりする)ことが判明しました。マネーマネジメントを使用する場合、必要な結果を表示するために何かを追加する必要はありますか?
 
A100:

コンパイルエラー

template<typename T>
void f( T, const T ) {}
class A {};
void OnStart()
{
        A * const a = new A;
        f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
そうやってコンパイルしているのであって、オリジナル版はそうではないはずです。
 
Комбинатор:
そうやってコンパイルしているのであって、オリジナル版はそうではないはずです。

なぜ?

template<typename T>
struct B {
        void f( T, const T ) {}
};
class A {};
void OnStart()
{
          const A* a;
        B<const A*> b;
        b.f( a, a ); //нормально
}

だからいいんです。原理的に何が変わったのでしょうか?

template<typename T>
        void f( T, const T ) {}
class A {};
void OnStart()
{
          const A *a;
          f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
 
A100:

根本的に何が変わったのでしょうか?

この差は大きいですそのために呼んだんでしょう。

void B<const A*>::f(const A*,const A*)
コンパイラは、テンプレートの正しいバージョンを把握できないという意味でバグを起こします。明らかにそのように指示した。
template<typename T>
        void f( T, const T ) {}
class A {};
void OnStart()
{
          const A *a;
          f<const A*>( a, a );
}

そして、それが功を奏している。

 
fxsaber:
そして、それが功を奏している。

なぜ文字数を増やしたのか?

 
A100:

なぜ文字数を増やしたのか?

コンパイラがパターンの完全に動作可能なバージョンを推測しないことを示すため。

 
fxsaber:

コンパイラがパターンの完全に動作可能なバージョンを推測していないことを示すため。

なぜ、そうする必要があるのでしょうか?ServiceDeskは自分で解決することができる

 
A100:

なぜ?

あなたの専門性から判断すると、このタイプはコンストラストを破棄しているはずです。正しい型を明示的に指定すれば、もちろんコンパイルされます。