現在、ライブラリの作成中です。遅延呼び出しとgcc、clang、MSVCを使用して動作するコールバックの登録を容易にします。インタフェース内の転送参照を含むオーバーロードが発生する
私は非常に奇妙なものを見つけました。私は2つのオーバーロードを持つ関数を持っていて、関数がインターフェイスで定義されている場合にのみエラーが発生します。 gcc 6.3.0-18とclang 3.8.1-24を使用して同じエラーが発生します。
保護されたコンストラクタを使用してGoogleが推奨するインターフェイスを作成します。
#include <queue>
#include <memory>
template <class T>
class IA {
public:
virtual ~IA() = default;
// virtual bool push(const T& souce) = 0; /* Issue */
virtual bool push(T&& source) = 0;
protected:
IA() = default;
};
私はstd::unique_ptr
は、
int main() {
A<std::unique_ptr<float> > a;
return 0;
}
すべてが正常に動作します使用してクラスをインスタンス化した場合、今インターフェース
template <class T>
class A : public IA<T> {
public:
~A() override {};
bool push(const T& source) {
m_queue.push(source);
return true;
}
bool push(T&& source) {
m_queue.push(std::move(source));
return true;
}
private:
std::queue<T> m_queue;
};
を実装するクラス。私はインターフェイスからプロトタイプbool push(const T& soruce)
で関数のコメントを外していない限り、コメントを外します。その後、私はエラーを取得します。
/usr/include/c++/6/ext/new_allocator.h:120:4: error: use of deleted
function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const
std::unique_ptr<_Tp, _Dp>&) [with _Tp = float; _Dp =
std::default_delete<float>]’
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
私はstd::unique_ptr
年代をコピーすることはできませんが、機能は実装だけに存在している場合は、なぜエラーが表示されないという事実を十分に認識しています。
私は問題がコピーコンストラクタに関連していると思う、unique_ptrはコピーコンストラクタまたはassigmentを許可します。 – JTejedor
私はそれを知っています。奇妙なことは、インターフェイスから関数を削除するとエラーが消えることです。すべてはまだ動作します。オーバーロードを維持したい理由は、後方互換性のためです。 –
少し実験した後、問題はコンパイラによってテンプレート関数が評価されるときだと私は思う。行にコメントが付いていない場合は、オブジェクトの作成時にテンプレートメンバー関数が評価されるため、オブジェクトの宣言時にエラーが表示されます。しかし、コピー関数メンバがコード内にない場合、メンバ関数は使用時に評価されます。 – JTejedor