Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++_C++11_Operator Overloading - Fatal编程技术网

C++ 多个操作员“;[……”是;匹配这些操作数

C++ 多个操作员“;[……”是;匹配这些操作数,c++,c++11,operator-overloading,C++,C++11,Operator Overloading,我有一个类,它既有到内部类型的隐式转换运算符(),也有通过用于设置存储的字符串索引运算符[]进行访问的能力。它在GCC6.3和MSVC上编译并在单元测试中运行得非常好,但是该类在intellisense和clang上产生了一些不可接受的模糊警告 超级瘦身版: #包括 #包括 #包括 结构设置 { int data;//这实际上是内在类型+std::string的变体 std::无序映射子对象; 模板 算子T() { 返回数据; } 模板 设置和运算符=(T val) { 数据=val; 归还*

我有一个类,它既有到内部类型的隐式转换运算符(),也有通过用于设置存储的字符串索引运算符[]进行访问的能力。它在GCC6.3和MSVC上编译并在单元测试中运行得非常好,但是该类在intellisense和clang上产生了一些不可接受的模糊警告

超级瘦身版:

#包括
#包括
#包括
结构设置
{
int data;//这实际上是内在类型+std::string的变体
std::无序映射子对象;
模板
算子T()
{
返回数据;
}
模板
设置和运算符=(T val)
{
数据=val;
归还*这个;
}
设置和运算符[](常量标准::字符串键)
{
if(子项计数(键))
返回*(子项[键]);
其他的
{
children[key]=std::shared_ptr(新设置());
返回*(子项[键]);
}
}
};
用法:

    Setting data;
    data["TestNode"] = 4;
    data["TestNode"]["SubValue"] = 55;
    int x = data["TestNode"];
    int y = data["TestNode"]["SubValue"];
    std::cout << x <<std::endl;
    std::cout << y;
    
output:
4
55
我不知道如何避免它所呈现的错误信息,同时保持我想要实现的目标。(按字符串隐式赋值和索引)

可能吗


注:我不能使用C++ 11以上的特性。

< P>问题是用户定义的隐式转换函数模板。< /P>
template<typename T>
operator T()
{
    return data;
}
选择2 消除从
设置
int
的隐式转换。可以通过将用户定义的转换标记为
explicit
来完成此操作

template <typename T>
explicit operator T() const;
选择3 消除从
设置
int
的隐式转换。另一种方法是完全删除用户定义的转换并使用函数

template <typename T>
T get() const;
我注意到的另一件事是:

std::shared_ptr<Setting>(new Setting())

还有一件事,我对您的设计了解不够,无法亲自做出决定,但您真的需要使用
std::shared\u ptr
?我不记得上次使用
std::shared_ptr
是什么时候了,因为
std::unique_ptr
效率更高,在大多数情况下似乎已经足够了。真的,你需要一个指针吗?是否有任何理由使用
std::shared_ptr
std::unique_ptr
超过
设置
?只是想一想。

谢谢,选项1似乎可以解决这个问题。共享的ptr是因为系统是否需要对子树进行某种形式的浅拷贝共享存在一些模糊性。但你的权利,从技术上讲,它不需要指针。
template <typename T>
T get() const;
int x = data["TestNode"].get<int>();
template<typename T>
operator T() const {
    return data;
}
std::shared_ptr<Setting>(new Setting())
std::make_shared<Setting>()