バリデーションテンプレートパラメータとしてベースがすべて渡されているmixinテンプレートを構築しようとしています。私は、各mixinクラスのコンストラクタパラメータをバリデリックテンプレートコンストラクタのパラメータとして渡してmixinを構築したいと思っています。コンストラクタパラメータを転送してバリデリックテンプレートに基づいてミックスインを構築する
各mixinクラスタイプのオブジェクトで呼び出されたときのバリデリックテンプレートコンストラクタはコンパイルされます。私は、各ミックスインクラスのコンストラクタのパラメータを渡す場合でも、それは私が-std = C++ 1Z
何午前にはgcc 7.0を使用しています
をコンパイルしません(すべてのクラスは、単一のパラメータのコンストラクタを持っています)私は間違っている?
#include <vector>
#include <string>
#include <unordered_map>
#include <iostream>
template < typename... T >
struct Mixin : T...
{
Mixin() = delete;
Mixin(Mixin const &) = delete;
Mixin(Mixin &&) = delete;
template < typename... U >
Mixin(U &&... v) : T(std::forward <U>(v))...
{
}
};
int main()
{
using A = std::vector <std::string>;
using B = std::unordered_map < std::string, std::string >;
using C = std::string;
using M = Mixin < A, B, C >;
// This doesn't compile
M m1{{"hello", "world"}, { {"hello", "world" }, {"world", "hello"} }, "hello"};
// This compiles
A a({"hello", "world"}); B b({ {"hello", "world" }, {"world", "hello"} }); C c("hello");
M m2{a, b, c};
}
一つの大きな問題は(無関係あなたの質問に)標準的な容器です(と 'std :: string')は実際に継承されるようには設計されていません。彼らは仮想デストラクタを持っていません。 –
コンパイラのエラーは...? – max66
_ "コンパイルしません" _続行... –