入住可变参数模板参数换uniqueness2

时间:2013-09-27 06:40:44

标签: c++ c++11 variadic-templates

我在这里发布关于检查variadic模板参数的唯一性 check variadic templates parameters for uniqueness

我的问题:为什么不编译以下代码?是不允许bug编译器或标准?

#include <iostream>


template< class ... > struct pack{};
template< class  > struct id{};
template< class  > struct base_all;
template< class ...T>
struct base_all< pack<T...> > : id<T> ... {using type = int;}; // <-- error with `int`, `char`, `int`  parameters.

template< class ...T>
struct is_unique
{
    template< class P,  std::size_t = sizeof(base_all<P>)  >
    struct check;

    template< class P >
    static constexpr bool test( check< P > * ) noexcept { return true ;}

    template< class P >
    static constexpr bool test( ... ) noexcept{ return false; }

    static constexpr bool value = test< pack<T...> >( nullptr );
};

int main()
{
    constexpr bool b = is_unique<int, float, double>::value;

    constexpr bool c = is_unique<int, char, int >::value; //<--- error 

    std::cout << std::boolalpha << "b = " << b << "\nc = " << c << std::endl;
}

错误编译器gcc 4.8.1:

is_unique_args.cpp:16:42:   required by substitution of ‘template<class P> static constexpr bool is_unique<T>::test(is_unique<T>::check<P>*) [with P = P; T = {int, char, int}] [with P = pack<int, char, int>]’

1 个答案:

答案 0 :(得分:1)

我编写了这样的例子:

g++ -Wall -Wextra -std=c++11 -rdynamic -pedantic garbage.cpp

并得到了不同的错误:

garbage.cpp: In instantiation of ‘struct base_all<pack<int, char, int> >’:
garbage.cpp:17:27:   required by substitution of ‘template<class P> static constexpr bool is_unique::test(is_unique<T>::check<P>*) [with P = P; T = {int, char, int}] [with P = pack<int, char, int>]’
garbage.cpp:22:63:   required from ‘constexpr const bool is_unique<int, char, int>::value’
garbage.cpp:29:52:   required from here
garbage.cpp:8:8: error: duplicate base type ‘id<int>’ invalid

再次突出显示错误:

  

重复的基本类型'id'无效

很清楚它意味着什么。 c ++禁止拥有更多相同类型的基类。因此,标准禁止这样做:

struct A
{};
struct B : A, A
{};

这就是你上面尝试做的事情。