我想知道如果结果对结果没有任何效果,是否有办法将类operator==
的使用转换为编译器错误。原因是当开发人员打算使用operator==
时,可以使用operator=
。
我不关心解决方案是否是GCC特定的,只要它适用于GCC 4.4.7。解决方案可以包括GCC特定的属性,编译器编译指示或下面给出的C ++类上的源代码文件更改。对编译器选项的更改不太有吸引力。
见下面的例子。取消注释下面的#define DO_STRING_LITERAL_TEST
行,您将看到来自编译器的有用消息:
/usr/bin/g++ -MD -DDEBUG -g -ggdb -gstabs+ -O0 -fPIC -Wall -Werror -Wsynth -Wno-comment -Wreturn-type main.cpp -c -o main.o
cc1plus: warnings being treated as errors
main.cpp: In function ‘int main(int, char**, char* const*)’:
main.cpp:37: error: comparison with string literal results in unspecified behaviour
评论#define DO_STRING_LITERAL_TEST
行,然后取消注释#define DO_STRING_CONTAINER_TEST
行。编译得很好,我希望它在指示的行上失败:
foo == " "; // <-- I need this to throw a compiler error
以下是示例代码:
#include <iostream>
#include <string>
class StringContainer {
private:
std::string _val;
public:
StringContainer(const char * inString = NULL) : _val(inString ? inString : "") {}
bool operator==(const StringContainer & other) const
{
return _val == other._val;
}
void operator=(const char * other)
{
_val = other;
}
const char * getString() const
{
return _val.c_str();
}
};
int main(int argc, char *argv[], char *const envp[])
{
std::cout << __FILE__ << ":" << __LINE__ << ":" << "main begin" << std::endl;
#define DO_STRING_LITERAL_TEST
#ifdef DO_STRING_LITERAL_TEST
const char * invalidval = "foo bar";
// The following use of == throws a nice compiler error on GCC 4.4.7:
invalidval == " ";
#endif // DO_STRING_LITERAL_TEST
//#define DO_STRING_CONTAINER_TEST
#ifdef DO_STRING_CONTAINER_TEST
StringContainer foo;
foo = "some string";
foo == " "; // <-- I need this to throw a compiler error
std::cout << __FILE__ << ":" << __LINE__ << ":" << "foo contains <" << foo.getString() << ">" << std::endl;
#endif // DO_STRING_CONTAINER_TEST
std::cout << __FILE__ << ":" << __LINE__ << ":" << "main end" << std::endl;
return 0;
} // end main
一个答案非常接近https://stackoverflow.com/a/12416677/257924。但是这指定使用一个看起来很有吸引力的函数属性,但是我需要在使用-Werror=unused-result
时使用balks的GCC编译器的版本:
cc1plus: error: -Werror=unused-result: No option -Wunused-result
如果暂时(对某些代码段,可能是)unused-result
警告只有源代码更改,那就更好了。 https://freeswitch.org/jira/browse/FS-6850#commentauthor_55299_verbose显然表示&#34;与gcc 4.8.3相同的测试通过,因为它支持参数。&#34;
答案 0 :(得分:1)
这不应该是您在代码中验证的内容。这应该是您的编译器将为您做的事情。如果您需要std::string
,则应使用std::string
- 而不是MyStringThatHasThisExtraEqualityCheck
。
我建议以下几点之一:
-Wunused-comparison
-Werror
以使其成为错误。你不需要运行clang二进制文件,但额外的正交不会受到伤害(只为slack off提供更多借口)。答案 1 :(得分:1)
GCC允许函数public class Touch extends AppCompatActivity implements OnTouchListener,OnClickListener {
private button boutonCompteur = null;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.id.Compteur);
boutonCompteur = (button) findViewById(R.id.Compteur);
boutonCompteur.setOnTouchListener(this);
boutonCompteur.setOnClickListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event)
{
return true;
} }
。你有没有尝试过你班级的比较器?
编辑:没关系。跳过你说你的旧GCC版本仍然不支持该属性的部分。