Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板类构造函数重载解析_C++_Templates_Constructor_Overload Resolution_Constructor Overloading - Fatal编程技术网

C++ 模板类构造函数重载解析

C++ 模板类构造函数重载解析,c++,templates,constructor,overload-resolution,constructor-overloading,C++,Templates,Constructor,Overload Resolution,Constructor Overloading,对于类模板的ctor重载解析,我有一个简单的问题: #include <iostream> #include <string> using namespace std; enum EnumTypeVal { READ, WRITE }; template <class T> class TemplateClassTest { public: TemplateClassTest(const string & stringVal, T type

对于类模板的ctor重载解析,我有一个简单的问题:

#include <iostream>
#include <string>

using namespace std;
enum EnumTypeVal { READ, WRITE };

template <class T>
class TemplateClassTest {
public:
    TemplateClassTest(const string & stringVal, T typeVal, EnumTypeVal e = READ,
                      const string & defaultStringVal = "default");
    TemplateClassTest(const string & stringVal, const char * charVal);
    TemplateClassTest(const string & stringVal, EnumTypeVal e = READ,
                      const string & defaultStringVal = "default");
private:
T type;
};

template <class T>
TemplateClassTest<T>::TemplateClassTest(const string & stringVal, T typeVal,
                                        EnumTypeVal e,
                                        const string & defaultStringVal)
{
    type = typeVal;
    cout << "In TemplateClassTest(const string &, T, EnumTypeVal, "
            "const string &)" << endl;
}

template <class T>
TemplateClassTest<T>::TemplateClassTest(const string & stringVal,
                                        const char * charVal)
{
    cout << "In TemplateClassTest(const string &, const char *)" << endl;
}

template <class T>
TemplateClassTest<T>::TemplateClassTest(const string & stringVal, EnumTypeVal e,
                                        const string & defaultStringVal)
{
    cout << "In TemplateClassTest(const string &, EnumTypeVal, const string &)"
         << endl;
}

typedef TemplateClassTest<long long unsigned int> u32Type;
typedef TemplateClassTest<bool> boolType;

int main()
{
    u32Type l("test", "0"); //matches ctor 2
    u32Type v("test", 0); // ambiguity between ctor 1 and 2
    boolType b("test", "true"); //matches ctor 2
    return 0;
}
#包括
#包括
使用名称空间std;
enum EnumTypeVal{READ,WRITE};
模板
类模板类测试{
公众:
TemplateClassTest(常量字符串和stringVal、T类型Val、EnumTypeVal e=READ、,
常量字符串&defaultStringVal=“default”);
TemplateClassTest(常量字符串和stringVal,常量字符*charVal);
TemplateClassTest(常量字符串和stringVal,EnumTypeVal e=READ,
常量字符串&defaultStringVal=“default”);
私人:
T型;
};
模板
TemplateClassTest::TemplateClassTest(常量字符串和stringVal,T类型Val,
枚举类型e,
常量字符串和defaultStringVal)
{
type=typeVal;

cout这是不明确的,因为
0
是一个空指针常量。空指针常量可以隐式转换为任何指针类型->空指针转换。因此,ctor 2是可行的:
TemplateClassTest(const string&,const char*)

作为一个整数文本,
0
属于
int
类型。构造函数1,
TemplateClassTest(const string&,T,EnumTypeVal=READ,const string&=“default”)
,因此需要从
int
转换为
无符号长时间
->一个整数转换

这两种转换,空指针转换和整数转换,具有相同的秩(转换),因此存在歧义


[conv.ptr]/1

空指针常量是一个整数类型的整数常量表达式prvalue,其计算结果为零或类型为
std::nullptr\u t
的prvalue。空指针常量可以转换为指针类型;结果是该类型的空指针值,并且可以与对象指针或函数poin的所有其他值区分开来这种转换称为空指针转换


与您的约束匹配的一个可能但难看的修复方法是将第二个构造函数更改为:

template<class U,
         class V = typename std::enable_if<std::is_same<U, const char*>{}>::type>
TemplateClassTest(const string & stringVal, U charVal);

这是不明确的,因为
0
是一个空指针常量。空指针常量可以隐式转换为任何指针类型->空指针转换。因此,ctor 2是可行的:
TemplateClassTest(const string&,const char*)

作为一个整数文本,
0
属于
int
类型。构造函数1,
TemplateClassTest(const string&,T,EnumTypeVal=READ,const string&=“default”)
,因此需要从
int
转换为
无符号长时间
->一个整数转换

这两种转换,空指针转换和整数转换,具有相同的秩(转换),因此存在歧义


[conv.ptr]/1

空指针常量是一个整数类型的整数常量表达式prvalue,其计算结果为零或类型为
std::nullptr\u t
的prvalue。空指针常量可以转换为指针类型;结果是该类型的空指针值,并且可以与对象指针或函数poin的所有其他值区分开来这种转换称为空指针转换


与您的约束匹配的一个可能但难看的修复方法是将第二个构造函数更改为:

template<class U,
         class V = typename std::enable_if<std::is_same<U, const char*>{}>::type>
TemplateClassTest(const string & stringVal, U charVal);

只需离开模板构造函数,将其专门化为T=char const*
typedef TemplateClassTest u32Type;
就可以解决问题,因为ctor 1变成了精确匹配。我不确定这是否会破坏一些不同的东西,因为
int
不需要精确的32位。这就是为什么C++11添加了
nullptr
关键字。@DyP:假设我已经有另一个typedef TemplateClassTest intType;@CodeWarrior 1)ctor是私有的。2)显式专用类模板的成员函数的越界定义不包含显式专用类模板的
模板
。只需使用
TemplateClassTest::TemplateClassTest(常量字符串和,常量字符*){/*..*/}
只需离开模板构造函数,将其专门化为T=char const*
typedef TemplateClassTest u32Type;
就可以解决这个问题,因为ctor 1变成了一个精确匹配。我不确定这是否会破坏一些不同的东西,因为
int
不需要精确的32位。这就是为什么添加C++11的完美例子
nullptr
关键字。@DyP:假设我已经有了另一个typedef TemplateClassTest intType;@code战士1)ctor是私有的。2)显式专用类模板的成员函数的越界定义不包含显式专用类模板的
template
。只需使用
TemplateClassTest::TemplateClassTest(const string&,const char*){/*..*/}
感谢您的响应..为什么它不匹配ctor 1,因为它应该有更好的排名..因为在这种情况下0也是t类型..我应该如何使u32Type v(“test”,0)和BooltType b(“test”,“true”)要匹配单独的ctor?@CodeWarrior
0
作为整型文字是
int
类型,而不是
无符号长整型int
类型。感谢您的响应。为什么它不匹配ctor 1,因为它应该具有更好的秩。既然在这种情况下0也是t类型…我应该如何使u32Type v(“test”,0)和boolType b(“test”,“true”)要匹配单独的ctor?@CodeWarrior
0
,整型文字的类型为
int
,而不是
无符号长整型int