我试图使用模板和结构,但它们不起作用.我搜索了很多,但我找不到解决方案.
#include <iostream> using namespace std; template<struct S> int add(S s) { return s.num + s.num2; } int main() { struct { int num = 10; int num2 = 20; } test; cout << add(test) << endl; return 0; }
使用gcc时,错误是:
test.cpp:5:17: error: ‘struct S’ is not a valid type for a template non-type parameter test.cpp: In function ‘int add(S)’: test.cpp:6:5: error: ‘s’ has incomplete type test.cpp:5:17: error: forward declaration of ‘struct S’ test.cpp: In function ‘int main()’: test.cpp:13:19: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default] test.cpp:14:20: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default] test.cpp:17:21: error: no matching function for call to ‘add(main()::<anonymous struct>&)’ test.cpp:17:21: note: candidate is: test.cpp:6:5: note: template<<declaration error> > int add(S) test.cpp:6:5: note: template argument deduction/substitution Failed: test.cpp:17:21: note: cannot convert ‘test’ (type ‘main()::<anonymous struct>’) to type ‘S’
解决方法
您不能在此处使用关键字struct.使用class或typename(您仍然可以使用结构实例化模板).
编辑:您的其他问题与main中的匿名结构有关.不记得我头顶的规则(也许其他人可以解释它们),但这是一种非常奇怪的做事方式,所以我只提供一个工作版本:http://ideone.com/VGIogH
有点相关:Can we have an anonymous struct as template argument?
再次编辑:您最初编写的内容,主要作品中的匿名结构(在模板中替换结构后)与–std = c 11,但不是没有(即c 03).