模板实例化 - 使用 C++11 的大小时没有匹配函数...() 具有某些类的运算符
Template instantiation - no matching function when using C++11's sizeof...() operator with certain classes
考虑下面的代码(C++11),它使用了Eigen 3库(http://eigen.tuxfamily.org):
#include <iostream>
#include <Eigen/Core>
template<typename T, int x, int y>
class mat {
public:
private:
T data[x*y];
};
class bazinga {
public:
template<typename T>
static void static_foo() {
std::cout << "STATIC BAZINGA FOO!n";
}
template<typename T>
void foo() {
std::cout << "BAZINGA FOO!n";
}
};
template<typename T>
void direct_foo() {
std::cout << "JUST FOO-IN'!n";
}
template<int i, int ... is>
void bar( bazinga &bz) {
direct_foo< mat<float, sizeof...(is), 3> >(); // OK
bazinga::static_foo< mat<float, sizeof...(is), 3> >(); // OK
bz.foo< mat<float, sizeof...(is), 3> >(); // OK
direct_foo< Eigen::Matrix<float, sizeof...(is), 3> >(); // OK
bazinga::static_foo< Eigen::Matrix<float, sizeof...(is), 3> >(); // ERROR
bz.foo< Eigen::Matrix<float, sizeof...(is), 3> >(); // ERROR
bazinga::static_foo< Eigen::Matrix<float, 3, 3> >(); // OK!!!
bz.foo< Eigen::Matrix<float, 3, 3> >(); // OK!!!
}
int main() {
bazinga bz;
bar<1,2,3,4>(bz);
}
类"mat"只是用来证明错误不会在使用自己的类时发生,而只在使用Eigen::Matrix类时发生。
有人能说出为什么会发生这种情况的原因或线索吗?或者发布解决方案?
谢谢!
编辑:我在ubuntu 11.10上使用g++4.6.1这是编译器的输出:
main.cpp: In function ‘void bar(bazinga&) [with int i = 1, int ...is = {2, 3, 4}]’:
main.cpp:46:24: instantiated from here
main.cpp:37:9: error: no matching function for call to ‘bazinga::static_foo()’
main.cpp:37:9: note: candidate is:
main.cpp:14:29: note: template<class T> static void bazinga::static_foo()
main.cpp:38:9: error: no matching function for call to ‘bazinga::foo()’
main.cpp:38:9: note: candidate is:
main.cpp:19:22: note: template<class T> void bazinga::foo()
编辑2:我想我还不够清楚:最让我惊讶的是,如果我传递一个固定值作为第二个模板参数(如bar()的最后两行),一切都很好,只使用sizeof。。。()运算符会导致错误,并且仅当与Eigen::Matrix一起使用时。
我认为这是一个编译器错误,因为传递整型文字很好,但sizeof...(is)
不起作用。所以我建议你试试这个:
constexpr int s = sizeof...(is);
bazinga::static_foo< Eigen::Matrix<float, s, 3> >();
bz.foo< Eigen::Matrix<float, s, 3> >();
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 重载运算符new[]的行为取决于析构函数
- 构造函数和转换运算符之间的重载解析
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 是什么让一些命名函数/运算符与众不同?
- 删除了所有自动生成的构造函数/运算符的类仍然可以从函数返回吗
- 如何在局部类中定义友元函数运算符>>?
- 隐式转换和函数运算符
- 如何从函数运算符(x,y)返回向量元素的引用
- C++/析构函数-运算符删除
- 获取函数运算符<未定义的引用
- VS2012 std::函数运算符 bool 意外返回 true
- "Polymorphic"非成员函数/运算符,是否需要额外的重载?
- Xcode - 控制到达非无效函数运算符错误的末尾
- 重载类函数运算符兼任二传手和吸气手
- 为简单结构定义哪个复制/移动构造函数/运算符
- 关于函数/运算符重载的困惑
- 函数运算符上的未定义引用>>
- C++ 重载函数运算符和继承,无法在子类函数中正确使用它
- 如何使用另一个类的重载函数运算符(operator())