C++ 更改构造函数优先级

C++ 更改构造函数优先级,c++,templates,constructor,overload-resolution,C++,Templates,Constructor,Overload Resolution,是否可以为所有派生类型定义构造函数和模板构造函数? 我编写了这个测试用例来说明我的问题: #include <iostream> class Variant; class CustomVariant; class Variant { public: Variant(void) {} Variant(const Variant&) { std::cout << "ctor" <

是否可以为所有派生类型定义构造函数和模板构造函数? 我编写了这个测试用例来说明我的问题:

#include <iostream>


class Variant;
class CustomVariant;


class Variant
{
public:
    Variant(void)
        {}


    Variant(const Variant&)
        {
            std::cout << "ctor" << std::endl;
        }


    Variant(const CustomVariant&)
        {
            std::cout << "custom" << std::endl;
        }


    template<typename T>
    Variant(const T&)
        {
            std::cout << "template" << std::endl;
        }
};


class CustomVariant : public Variant
{
};


class DerivedVariantA : public CustomVariant
{
};


class DerivedVariantB : public CustomVariant
{
};


int main(void)
{

    DerivedVariantB dvb;

    Variant v(dvb);
    // expcected output: "custom" instead of "template"

}
#包括
类变量;
类自定义变量;
类变量
{
公众:
变体(无效)
{}
变量(常量变量&)
{
标准::cout

<> P>这使得模板不能从变型< /COD>中获得实例化,因此在过载解析期间将无法使用。<代码> Enable,如果和 iSubaseOb/<代码>在C++ 0x中是C++的新的,编译器和标准库可以支持它们。如果没有,你也可以在C++ Tr1或.< /P>< P>在类中可用的构造函数列表中,没有任何构造函数将类型为
DerivedVariantB
的实例作为参数。因此正在调用生成的模板

class DerivedVariantB ; // Forward Declaration

class Variant
{
    public:
    // ...

     Variant( const DerivedVariantB &obj )
     {
         std::cout << "\n DerivedVariantB \n";
     }
};
class-DerivedVariantB;//转发声明
类变量
{
公众:
// ...
变量(常量派生变量TB和obj)
{

是的,这是标准定义的规则。问题是,有什么解决办法吗?:)哇,太好了。这是因为SFINAE(值不是为派生自变量的类型定义的)?@cytrinox:是的,SFINAE就是这么说的,如果
是为它启用的,那么这就是它的作用。
template<typename T>
Variant(const T&, 
        typename std::enable_if<
                     !std::is_base_of<Variant, T>::value, void*
                 >::type = 0)
{
    std::cout << "template" << std::endl;
}
class DerivedVariantB ; // Forward Declaration

class Variant
{
    public:
    // ...

     Variant( const DerivedVariantB &obj )
     {
         std::cout << "\n DerivedVariantB \n";
     }
};