Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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++;:共享\u ptr不能很好地使用模板化函数_C++_Templates_Visual Studio 2012_C++11_Shared Ptr - Fatal编程技术网

C++ C++;:共享\u ptr不能很好地使用模板化函数

C++ C++;:共享\u ptr不能很好地使用模板化函数,c++,templates,visual-studio-2012,c++11,shared-ptr,C++,Templates,Visual Studio 2012,C++11,Shared Ptr,我在让共享指针与模板化数据管理函数一起工作时遇到了一些问题。我有一些简单的结构,其中包含各种对象的加载数据,例如: struct loadedShipData_t { enum VARIABLES { // snip for readability: lots of variable names for identification }; std::string textureKey; std::array<int, 20> data

我在让共享指针与模板化数据管理函数一起工作时遇到了一些问题。我有一些简单的结构,其中包含各种对象的加载数据,例如:

struct loadedShipData_t {
    enum VARIABLES {
        // snip for readability: lots of variable names for identification
    };

    std::string textureKey;
    std::array<int, 20> data;
};

struct loadedStarfieldData_t {
    enum VARIABLES {
        // snip for readability: lots of variable names for identification
    };

    std::array<int, 8> data;
};
struct loadedShipData\u t{
枚举变量{
//可读性剪报:大量用于标识的变量名
};
std::字符串纹理键;
std::数组数据;
};
结构加载的StarFieldData\u t{
枚举变量{
//可读性剪报:大量用于标识的变量名
};
std::数组数据;
};
构造这些数据结构的实例时,会插入指向其相应无序映射(每个数据类型一个)的指针,以便在需要时访问它们,例如

std::unordered_map<std::string, std::shared_ptr<loadedShipData_t>> shipData;
std::unordered_map<std::string, std::shared_ptr<loadedStarfieldData_t>> starfieldData;
std::无序地图数据;
std::无序地图星域数据;
…等等

我在实现模板化函数时遇到困难的是一个名为getData的函数,它返回一个指针,指向存储在给定键的无序映射中的数据结构

template <typename DATA>
    std::shared_ptr<DATA> getData(DATA_TYPES dataType, const std::string& key) {
        switch (dataType) {
            case STARFIELD_DATA:
                return starfieldData.at(key);
            case SHIP_DATA:
                return shipData.at(key);
            // snip for readability: all the other data types
            default:
                throw UNDEFINED_DATA_TYPE();
                break;
        };
    }
模板
std::shared_ptr getData(数据类型dataType,const std::string和key){
交换机(数据类型){
案例STARFIELD_数据:
返回starfieldData.at(键);
案例船舶数据:
返回shipData.at(键);
//可读性剪报:所有其他数据类型
违约:
抛出未定义的_数据_类型();
打破
};
}
此函数被称为:

std::shared_ptr<loadedStarfieldData_t> loadedData = data.getData<loadedStarfieldData_t>(STARFIELD_DATA, key);
std::shared_ptr<loadedShipData_t> loadedShipData = data.getData<loadedShipData_t>(SHIP_DATA, "Debug");
std::shared_ptr loadedData=data.getData(STARFIELD_data,key);
std::shared_ptr loadedShipData=data.getData(SHIP_data,“Debug”);
以及错误消息:

<file_path> error C2664: 'std::shared_ptr<_Ty>::shared_ptr(std::nullptr_t)' : cannot convert parameter 1 from 'std::shared_ptr<_Ty>' to 'std::nullptr_t'
          with
          [
              _Ty=loadedShipData_t
          ]
          and
          [
              _Ty=loadedStarfieldData_t
          ]
          nullptr can only be converted to pointer or handle types
          <file_path> : see reference to function template instantiation 'std::shared_ptr<_Ty> DataManager::getData<loadedShipData_t>(DATA_TYPES,const std::string &)' being compiled
          with
          [
              _Ty=loadedShipData_t
          ]
<file_path> error C2664: 'std::shared_ptr<_Ty>::shared_ptr(std::nullptr_t)' : cannot convert parameter 1 from 'std::shared_ptr<_Ty>' to 'std::nullptr_t'
          with
          [
              _Ty=loadedStarfieldData_t
          ]
          and
          [
              _Ty=loadedShipData_t
          ]
          // snip for readability: other data types
          nullptr can only be converted to pointer or handle types
          <file_path> : see reference to function template instantiation 'std::shared_ptr<_Ty> DataManager::getData<loadedStarfieldData_t>(DATA_TYPES,const std::string &)' being compiled
          with
          [
              _Ty=loadedStarfieldData_t
          ]
          // snip for readability: other data types
错误C2664:'std::shared_ptr::shared_ptr(std::nullptr_t)':无法将参数1从'std::shared_ptr'转换为'std::nullptr_t'
具有
[
_Ty=加载的发货数据
]
和
[
_Ty=加载的StarFieldData\u t
]
nullptr只能转换为指针或句柄类型
:请参阅正在编译的函数模板实例化“std::shared_ptr DataManager::getData(数据类型,常量std::string&)”的参考
具有
[
_Ty=加载的发货数据
]
错误C2664:'std::shared_ptr::shared_ptr(std::nullptr_t)':无法将参数1从'std::shared_ptr'转换为'std::nullptr_t'
具有
[
_Ty=加载的StarFieldData\u t
]
和
[
_Ty=加载的发货数据
]
//可读性剪报:其他数据类型
nullptr只能转换为指针或句柄类型
:请参阅正在编译的函数模板实例化“std::shared_ptr DataManager::getData(数据类型,常量std::string&)”的参考
具有
[
_Ty=加载的StarFieldData\u t
]
//可读性剪报:其他数据类型
我已经无数次地查看和修改代码,所以我想我会看看是否有其他人遇到过类似的问题。我在这里发现了几个类似的问题,但无法找出出了什么问题,所以我想我会把我自己的问题的细节公布出来,看看这些部分中的C++大师是否能指出我的正确方向。 谢谢你的时间和考虑


另外,如果有帮助的话,我正在使用Visual Studio 2012进行编译。

从外观上看,您正在尝试将
共享\u ptr
转换为
共享\u ptr
。作为猜测,它们可能是不兼容的指针类型,这与尝试从声明为返回
loadedStarfieldData.*
的函数返回
loadedShipData.
不起作用的原因不同

要在此基础上展开,请执行以下操作:

std::shared_ptr<loadedStarfieldData_t> loadedData = data.getData<loadedStarfieldData_t> STARFIELD_DATA, key);
std::shared_ptr loadedData=data.getData STARFIELD_data,key);
将模板基本转化为以下内容:

std::shared_ptr<loadedStarfieldData_t> getData(DATA_TYPES dataType, const std::string& key) {
    switch (dataType) {
        case STARFIELD_DATA:
            return starfieldData.at(key);
        case SHIP_DATA:
            return shipData.at(key); // <-- type mismatch here
        // snip for readability: all the other data types
        default:
            throw UNDEFINED_DATA_TYPE();
            break;
    };
}
std::shared\u ptr getData(数据类型dataType,const std::string和key){
交换机(数据类型){
案例STARFIELD_数据:
返回starfieldData.at(键);
案例船舶数据:

return shipData.at(key);//函数模板不是一个可以在运行时神奇地更改其类型的函数。它根本不是一个函数。它是一个制作常规非神奇函数的方法。如果您无法编写一个函数来实现您想要的固定类型集,那么您也无法编写一个神奇的模板来实现它


您试图编写一个函数,它将返回A或B类型,这取决于运行时参数。这些函数不存在于C++中,不能使用模板。

不应该是这样的,因为Stfield调用完全不依赖于调用。或者,您指的是代码I PO中的特定内容。我在原始帖子中添加了loadedShipData_t结构和loadedStarfieldData_t结构的示例调用,以提高清晰度。确实如此。您可能知道,只会执行一条返回语句,但编译器将编译其他语句。您不能从同一条语句返回两种不同的类型函数,即使该函数是一个模板。你必须有某种公共类型,它们都可以转换为该类型。@Samuel:函数不知道对于给定的T,开关中唯一会被击中的情况是对应的类型。函数中所有可能的返回必须返回一个可转换为fu的类型nction的返回类型。模板是“查找和替换”--如果用某个特定类型替换t不起作用,那么它对模板也不起作用。(在这种特殊情况下,您可以使用标记分派/部分专门化来绕过它)啊,我明白了。我想这是有道理的。既然我仍然非常愿意,那么你建议我如何着手解决这个问题呢