我有一个数学向量,我用模板参数int N
定义了它的维度。问题是我在构造函数中添加了很多参数,最多N = 9,g ++就可以了,但是英特尔编译器抱怨这个带有警告
警告#175:下标超出范围
是的,下标超出了范围,但不是,它不会引起问题,因为它是这样写的:
template <int N, typename T>
Vector<N,T>::Vector(T val0, T val1, T val2, T val3, T val4, T val5, T val6, T val7, T val8, T val9)
{
for(int i = 0; i < N; i++)
{
_values[i] = T();
}
_values[0] = val0;
if(N > 1)
_values[1] = val1;
if(N > 2)
_values[2] = val2;
if(N > 3)
_values[3] = val3;
if(N > 4)
_values[4] = val4;
if(N > 5)
_values[5] = val5;
if(N > 6)
_values[6] = val6;
if(N > 7)
_values[7] = val7;
if(N > 8)
_values[8] = val8;
if(N > 9)
_values[9] = val9;
}
其中N是维度,就像我提到的那样,T是数据类型。因此,英特尔编译器不够聪明,不会意识到这不会导致任何问题,因为除非索引有效,否则我不访问该元素。
问题是:如何告诉编译器类似宏/预编译器命令,它不应该为这些行发出警告#175?请注意,完全禁用警告#175并不聪明,尽管我仍然可以在其他地方执行真正的错误;我只想为这段代码禁用它。
感谢您的任何努力。
答案 0 :(得分:1)
正如Jarod42建议您可以使用#pragmas忽略特定位置的警告,并提到了简单示例here。
答案 1 :(得分:1)
如前所述,您可以使用编译器特定的#pragma
来禁用警告。这个解决方案的烦人之处在于它不可移植,并且一些编译器在找到其他编译器#pragma
时会发出警告。所以你最终只是交易警告。
您可以使用另一个#pragma
解决此问题,或使用
#ifdef SOME_MACRO_DEFINED_BY_COMPILER_A
#pragma SOME_PRAGMA_FOR_COMPILER_A
#endif
#ifdef SOME_MACRO_DEFINED_BY_COMPILER_B
#pragma SOME_PRAGMA_FOR_COMPILER_B
#endif
我宁愿确保没有编译器看到可以引发此警告的代码。我会做一些事情(未经测试),如:
template <int i>
typename std::enable_if<(i < N)>::type
set(const T& val) {
_values[i] = val;
}
template <int i>
typename std::enable_if<(i >= N)>::type
set(const T&) {
}
Vector(T val0, T val1, T val2, T val3, T val4, T val5, T val6, T val7, T val8, T val9) {
for(int i = 0; i < N; i++)
{
_values[i] = T();
}
_values[0] = val0;
set<1>(val1);
set<2>(val2);
set<3>(val3);
set<4>(val4);
set<5>(val5);
set<6>(val6);
set<7>(val7);
set<8>(val8);
set<9>(val9);
}